谢谢您的阅读。 关注:请看“大猫玩程序”c语言系列文章
1. 结构体
问题1:结构体的赋值?
答:c语言中的结构变量赋值在初始化或定义后按字段分配。
方式1 :初始化
结构标签
{
char a;
int b;
} x={‘a’,1}; /*初始化*
或者
结构标签
{
char a;
int b;
(;
structtagx={‘a’,1}; /*定义变量时初始化*
GNU C可以使用其他方法。
结构标签
{
char a;
int b;
}x=
{
. a=‘a’,
. b=1;
(;
或者
结构标签
{
char a;
int b;
(;
结构标签x=
{
. a=‘a’,
. b=1,
(;
方式2 :定义变量后,为每个字段赋值
结构标签
{
char a;
int b;
(;
结构标签x; /*定义变量*
x.a=‘a’; /*为每个字段分配值*
x.b=1; /*为每个字段分配值*
另一方面,在kfdfy以初始化方式分配值的情况下,例如x={‘a’,1}; 发生错误。
方式3 :结构变量之间的赋值
结构标签
{
char a;
int b;
(;
结构标签x,y;
x.a=’a’;
x.b=1;
y=x; /*结构变量之间的直接赋值*
问题2:结构体变量如何比较?
答:结构体变量之间可以用=直接赋值,但不能用比较符进行比较,如==。因为比较符===只影响基本数据类型。 但是,与结构体对应的对象是存在于存储器上的地址的内容,在这种情况下,为intmemcmp(constvoid*s1,const void *s2,size_t n ); 进行存储器上的比较。
问题3:结构体位域
答:位字段是一个或多个位的字段,而长度不同的字段(如声明为未定义int类型的字段)存储在声明类型的一个或多个变量(如整数变量)中。
位域类型:在char、short或int中,经常使用int,最好带signed或unsigned
位域特征:
可以不命名字段,如unsigned int :1; 可用于填充; unsigned int :0; 宽度0强制与以下整数对齐,因此与无符号整型边界对齐: 位域定义:
结构st1
{
unsigned char a:7; /*字段a占用了1字节的7位*/
unsigned char b:2; /*字段b是两个比特*/
unsigned char c:7; /*字段c是7个比特*/
(s1;
Sizeof(s1 )等于3。
一个位域字段必须存储在该位域类型的一个单元所占用的空间中,因此不能遍历两个该位域类型的单元。 也就是说,如果一个位域字段位于两个该位域类型的单元之间,则只使用第二个单元,而使用第一个单元的其馀位位置完成(pad ) 0。
然后,您可以看到sizeof(s2 )等于3 * sizeof (int ),也就是12
结构st2
{
unsigned int a:31;
unsigned int b:2; /*上一个整数变量只剩下一个位,不能容纳两个位,因此只能存储在下一个整数变量中*/
unsigned int c:31;
(s2;
位域的好处:
1 .某些信息在存储时不需要占用完整的字节,而只需要占用几个位或二进制位。 例如,保存一个开关量时,只有0和1两种状态,可以使用一位二进制文件。 这样可以节省存储空间,并简化处理。 这样,可以用一个字节的二进制位区域表示几个不同的对象。
2 .可以利用比特域逐比特分解一个变量。 例如,如果有四个从0到3的随机数字,则可以使用rand ()和两个二进制位作为每个位区域,从而节省时间和空间。
位域缺点:
由于位区的处理可能根据系统而不同,诸如位段成员是在存储器中从左向右分配还是从右向左分配,因而位区的使用不利于程序可移植性。
问题4:结构体成员数组大小为0
结构数组成员大小为0是GNU C的特性之一。 具有可以给结构体分配不定长度的大小的优点。示例:
typedef struct st
{
int a;
int b;
char c[0];
}st_t;
sizeof(ST_t )为8,即char c[0]的大小为0。
#define SIZE 100
ST_t*s=(ST_t* ) malloc ) SIZE ) ST_t ) SIZE );
2 函数
问题1:函数参数入栈顺序
答:c语言函数参数的推送顺序由编译器决定。 更具体地说,函数调用规则决定参数的推送顺序。 由于采用c语言时函数调用约定为__cdecl,所以对于函数声明来说,完整的形式是int__cdeclfunc(inta,int b )。
问题2:inline内联函数
答:inline关键字只是向编译器提出内联展开处理,通过将函数直接嵌入调用方主体中,可以省去调用/返回指令。