int main()
{
/*
定义结构体类型
1.结构体占用空间大小为属性(成员)占用空间大小的和
1>如果结构体占用空间大小不是占用空间最大元素的倍数
则会自动补齐为倍数。
2>sizeof(p4.name)=8, sizeof(p4.age)=4, sizeof(p4.sex)=4
8+4+4=16, 16=2*8 所以 sizeof(p4)=16
3>sizeof(t.a)=8, sizeof(t.b)=4
8+4=12, 12<2*8 && 12>1*8 所以 sizeof(t)=16
2.指针占用8byte
3.结构体在内存中的存放方式
低位
地址 属性名称
ff00 name
ff08 age
ff0c sex
高位
4.相同作用域范围内的结构体类型名称不能重复
5.结构体类型定义时,可省略名称
6.结构体类型定义在哪里,那么他的作用域范围就属于那里
如果在函数test里定义了结构体T,那么结构体T只能在函数test里使用
7.结构体类型必须在使用前定义,如果结构体的类型定义在使用之后会报错
类似变量在定义后才能使用,是一个道理
*/
struct Test
{
char *a;
int b;
}t;
struct Person
{
char *name;
int age;
int sex;
}p4;//可在定义类型时直接定义变量
/*
此方式定义结构体变量是正确的
允许省略结构体名称
*/
struct
{
char *a;
int b;
} t1;
printf("sizeof(p4)=%lu, sizeof(p4.name)=%lu"+
"\nsizeof(p4.age)=%lu, sizeof(p4.sex)=%lu\n\n",
sizeof(p4), sizeof(p4.name),
sizeof(p4.age),sizeof(p4.sex));
printf("sizeof(t)=%lu, sizeof(t.a)=%lu, sizeof(t.b)=%lu\n\n",
sizeof(t), sizeof(t.a),sizeof(t.b));
printf("&p4=%p, &p4.name=%p \n&p4.age=%p, &p4.sex=%p\n\n",
&p4,&p4.name,&p4.age,&p4.sex);
printf("----------------------------------------\n\n");
//定义结构体变量
struct Person p1={"p1",10,1};
struct Person p2;
p2.name="p2";
p2.sex=0;
p2.age=11;
//赋值的时候可以不按照顺序,但必须指定属性
struct Person p3={.age=12,.name="p3",.sex=1};
p4.name="p4";
printf("p1=%s, p2=%s, p3=%s, p4=%s\n\n",p1.name,p2.name,p3.name,p4.name);
struct Test tt[3]=
{
{"tt1",1},
{"tt2",2},
{"tt3",3}
};
//错误的写法,结构体只有在初始化时才允许用{}进行赋值
//tt[0]={"5",5};
tt[0].a="tt5";
tt[0].b=5;
for(int i=0;i<3;i++)
{
printf("%s,%d\n",tt[i].a,tt[i].b);
}
printf("----------------------------------------\n\n");
/*
结构体指针
*/
struct Person *pp=&p1;
//先取出对应的结构体变量(*pp) 再找对应的属性
printf("(*pp).name=%s, (*pp).age=%d, (*pp).sex=%d\n\n",
(*pp).name,(*pp).age,(*pp).sex);
//直接通过结构体地址找到结构体中的属性 -> 用在结构体指针中
printf("pp->name=%s, pp->age=%d, pp->sex=%d\n\n",
pp->name,pp->age,pp->sex);
printf("----------------------------------------\n\n");
/*
结构体的嵌套定义
1.结构体不允许包含自己
struct Test{
struct Test t;
};
上边是错误的写法
*/
struct Test2
{
int a;
struct Test t;
};
struct Test2 test2={1,{"t1",1}};
test2.t.b=10;
printf("test2.a=%d, test2.t.a=%s, test2.t.b=%d\n\n",
test2.a,test2.t.a,test2.t.b);
return 0;
}
输出结果
sizeof(p4)=16, sizeof(p4.name)=8
sizeof(p4.age)=4, sizeof(p4.sex)=4
sizeof(t)=16, sizeof(t.a)=8, sizeof(t.b)=4
&p4=0x7fff4ff78bc8, &p4.name=0x7fff4ff78bc8
&p4.age=0x7fff4ff78bd0, &p4.sex=0x7fff4ff78bd4
----------------------------------------
p1=p1, p2=p2, p3=p3, p4=p4
tt5,5
tt2,2
tt3,3
----------------------------------------
(*pp).name=p1, (*pp).age=10, (*pp).sex=1
pp->name=p1, pp->age=10, pp->sex=1
----------------------------------------
test2.a=1, test2.t.a=t1, test2.t.b=10
1307

被折叠的 条评论
为什么被折叠?



