相对于c语言 c 对于结构体最大的改变,C语言 结构体

//结构体

#define _CRT_SECURE_NO_WARNINGS#include#include#include

//结构体是一种构造数据类型,用途把不同的数据组合成一个整体//结构体变量数据大,作为参数的时候一般会使用结构体指针传参//结构体类型不分配内存,不能赋值,存取,运算

structnameinfo{intnum;char name[40];

}d1,d2[9],*d3;//结构体的定义①//匿名结构体,用于限制该结构体的数量,只给某些有权限的使用

struct{intsnum;char sname[40];

}sd1;//匿名结构体,必须在定义的时候就创建变量,其他条件下无法创建

structmao{charch;int a[10];

};structgou{intnum;char name[10];

};structlang{intnum;doublelongnum;char name[10];

};voidmain9(){//结构体的定义②

structnameinfo info;//结构体赋值

info.num = 1;

strcpy(info.name,"小米");//数组不可以直接赋值

printf("结构体的成员变量num=%d,name=%s\n", info.num, info.name);//结构体赋值②

struct nameinfo d4 = { 2, "华为"};//注意:结构体变量用大括号赋值,只有在创建并初始化的时候才可以//d1 = { 2, "华为" }; 错误 不可如此赋值//结构体指针

struct nameinfo *p =NULL;//结构体指针的初始化①

p = &info;

p->num = 2;//结构体指针的赋值

strcpy((*p).name, "雷云");

printf("结构体的成员变量num=%d,name=%s\n", (*p).num, p->name);//结构体指针的初始化②

struct nameinfo *p1 =NULL;

p1= (struct nameinfo *)malloc(sizeof(structnameinfo));

p1->num = 3;

strcpy((*p1).name, "马化腾");

printf("结构体的成员变量num=%d,name=%s\n", (*p1).num, p1->name);//结构体字节对齐原则//结构体变量占据的内存单元的个数应大于或者等于是其内部所有数据成员占据内存单元数的和。//出于效率的考虑,C语言引入了字节对齐机制,一般来说,不同的编译器字节对齐机制有所不同,但还是有以下3条通用准则://(1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除;//(2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);//(3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。//字节对齐第3条准则提及最宽基本类型的概念,所谓基本类型是指像char、short、int、float、double这样的内置数据类型。//“数据宽度”就是指其sizeof的大小。诸如结构体、共用体和数组等都不是基本数据类型//简单总结:结构体大小必须包含所有的成员数据,并且可以整除最宽基本类型成员//事例//对于struct mao,最宽基本类型成员是int,占4个字节,//根据结构体字节对齐原则,必须是最宽基本类型成员的倍数

/*struct mao{

char ch;//char原本是1个字节,但是都要被最宽基本类型成员int整除,所以此时ch所占的大小是4

int a[10];//数组不是基本类型,但是他的大小也必须被最宽基本类型成员int整除,

//数组a原始大小就是sizeof(int)*10 =40个字节,本来就可以被4整除,所以不用变化

};*/

//所以struct mao的大小是 4(char) + 40(int [10]) =44个字节//对于struct gou,最宽基本类型成员是int,占4个字节,

/*struct gou{

int num; //int原来是4个字节,正好被4整除,不用填充字节,还是4字节

char name[10];//数组name原来是sizeof(char)*10 = 10个字节,10不是4的倍数,10距离4的倍数最近的是12

//所以数组name的大小是12个字节

};*/

//所以struct mao的大小是4(int) + 12(char [10]) = 16个字节//对于struct lang,最宽基本类型成员是double,占8个字节,

/*struct lang{

int num;//int原本4个字节,但是都要被最宽基本类型成员double整除,所以此时ch所占的大小是8

double longnum;//double正好被double整除,不用填充字节

char name[10];//数组name原来是sizeof(char)*10 = 10个字节,10不是8的倍数,10距离4的倍数最近的是16

//所以数组name的大小是16个字节

};*/

//所以struct lang的大小是8(int) + 8(double) + 16(char [10]) = 32个字节

printf("结构体mao的大小是%d\n", sizeof(structmao));

printf("结构体gou的大小是%d\n", sizeof(structgou));

printf("结构体lang的大小是%d\n", sizeof(structlang));

system("pause");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值