c语言:Struct-创新互联

结构体:一些值的集合,这些值被称为成员变量,结构的每个成员可以是不同类型的 声名:

创新互联是一家专注于成都网站设计、成都网站制作与策划设计,萨尔图网站建设哪家好?创新互联做网站,专注于网站建设十年,网设计领域的专业建站公司;建站业务涵盖:萨尔图等地区。萨尔图做网站价格咨询:028-86922220
struct stu
{
char name[20];
int age;
}s1,s2;//s1,s2是结构体全局变量
int main()
{
struct stu s3,s4//s3,s4是结构体局部变量
return 0;
}
typedef 重命名:
typeddf struct stu
{
char name[20];
int age;
}stu;
stu s5,s6;//不用再写struct
匿名结构体:

创建变量必须紧跟结构体声明,只能用一次(指向同样的类型的结构体指针不能存放结构体地址,系统认为不相同)

struct 
{
char name[20];
int age;
}x;
结构体指针声明:
struct stu
{
char name[20];
int age;
}*p;//p为指向 stu结构体的指针
结构体自引用:在结构体中引用结构体,如链表
struct Node
{int value =0;
struct Node* next
};
结构体自引用的typedef:
struct Node
{int value =0;
struct Node* next
};
结构体变量定义及初始化的三种方式
struct stu
{
char name[20];
int age;
}s1={"amy",12};

struct stu s2={"tom",12};

int main()
{
struct stu s3={"jack",12};
return 0;
}
乱序初始化:
struct stu
{
char name[20];
int age;
};
int main()
{
struct stu s3={.name="jack",.age=12};
return 0;
}
结构体访问:
struct stu
{
char name[20];
int age;
};
int main()
{
struct stu s3={"jack",12};
printf("%d",s3.age);
return 0;
}
结构体内存对齐:

结构体内存对齐规则:

struct s1
{ char c1;
  int i;
 char c2;
};

结构体内存对齐规则:

  1. 第一个成员在偏移量为0处

2.从第二个成员开始,每个成员放在对齐数的整数倍处

(对齐数=结构体成员大小和默认对齐数中的较小值,vs是8,Linux无默认是成员自己本身大小)

3.结构体大小是大对齐数的整数倍

  1. 选择被嵌套的结构体成员变量的大对齐数作为起始地址,大小为被嵌套的结构体字节

  1. 结构体的大偏移数包括嵌套结构体的偏移数

  1. 数组看成多个独立数据数据,对齐数看数组类型

解析:c1是第一个成员地址在偏移量为0处

c1和i中的空间被浪费掉

大对齐数是i的4,能装下所有的成员,以及为4的最小整数为12,即结构体内存大小

检验:

宏offsetof计算成员偏移量

printf("%d\n",offsetof(struct s1 c1));

对齐原因:硬件只能访问某些特定地址的对齐数

对齐处理器要一次内存访问,非对齐要两次

如图:非对齐访问i要访问两次,而对齐访问i只要访问一次

设计结构体时尽量把空间小的成员放在一起

修改默认对齐数:#program pack()

#program pack(4)//默认对齐数是4
#prgram pack()//恢复默认对齐数
#program pack(1)//默认对齐数为1,相当于无默认对齐数

结构体传参:

传值和传地址

传参要压栈,选结构体地址

void print1(struct s s1)
{;}
void print2(struct s* ps)
{;}
位段:位:二进制位
  1. 成员必须是整型家族int,unsigned int 或char (一般同类型)

  1. 位段成员名后边有一个冒号和数字

struct A{
int _a:2;//表示只占两个比特位
int _c:5;
int _c:5;
}

位段开辟:以(int)4个字节或(char)1个字节开辟空间

//先开辟32个字节 能装下_a,_b,_c不够再开辟4个字节
计算位段大小:
struct A{
char a:3
char b:6
char c:3
}
int main()
{char a=9;
char b=3;
char c=4;
}

在vs环境下

分析:截断:9(2):1001->001 放入数据低位

剩下的比特位不足以放6个字节,再开辟1个字节空间(int 就4个字节)。

跨平台问题:

位段中int是有符号还是无符号不确定

位段int的大小是不确定的

位段使用一个字节的方式不确定(使用低位还是高位?)

当一个结构包含两个位段,第二个位段成员比较大,无法容纳第一个位段剩余的位时时,是否舍弃位还是利用是不确定的。(vs中舍弃)

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前标题:c语言:Struct-创新互联
URL分享:http://ybzwz.com/article/jpohj.html