首页 > 编程知识 正文

c语言结构体定义(c语言结构体详解)

时间:2023-05-05 01:20:21 阅读:77718 作者:1703

谢谢您的阅读。 关注:请看“大猫玩程序”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关键字只是向编译器提出内联展开处理,通过将函数直接嵌入调用方主体中,可以省去调用/返回指令。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。