相信大家在c语言自定义的学习过程中,离不开结构体,并且大为头疼!!别慌来看这篇文章,由浅入深干翻结构体!!!
提示:以下是本篇文章正文内容,下面案例可供参考
suruct name
{
member-list;
}variable-list
- struct Famliy
- {
- char name_mom[20];
- char name_father[20];
- char name_son[20];
- char name_dog[20];
- };//此处的分号不能丢!!!!!
- struct
- {
- int a;
- int b;
- char c;
- }x;
- struct
- {
- int a;
- int b;
- char c;
- }a[20],*p;
上述两个匿名结构体类型都省略掉了结构体标签tag
那么在上述代码中!!!
p=&x;//这段代码是否合法???
答案显然是错误的我们稍加调试就可以知道,这是不可以的,编译器会自动将上面两个类型当成两个不同的类型。所以是非法的
当我们使用结构体时,如果需要在结构中存放一个与刚开始一样的结构体变量那么我们看图:
当此时!!!struct里面存放了struct,此循环无穷无尽,无法算出此结构体类型的大小,因此,我们在此时,需要存放结构体指针!!!如图:
有了结构体变量类型之后,定义变量,就变得容易了很多!!!
- struct Point
- {
- int x;
- int y; }p1; //声明类型的同时定义变量p1
- struct Point p2; //定义结构体变量p2
p1,p2此时都是全局变量,大家可以自行选择方式定义结构体变量
要是想边定义变赋值,这当然也可以!!!
// 初始化:定义变量的同时赋初值。
struct Point p3 = {x, y}
struct Point p3 = {x, y}; struct Stu //类型声明 { char name[15];//名字 int age; //年龄 };
struct Stu s = {"zhangsan", 20};//初始化
struct Node { int data; struct Point p; struct Node* next; }n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
用途:计算结构体的大小(重点)
第一题看起来很简单1+4+1=6,第二题1+1+4=1,第三题8+1+4=13
然而并非如此!!!
- //练习1
- struct S1
- {
- char c1;
- int i;
- char c2;
- };
- printf("%d\n", sizeof(struct S1))
- //练习2
- struct S2
- {
- char c1;
- char c2;
- int i;
- };
- printf("%d\n", sizeof(struct S2));
- //练习3
- struct S3
- {
- double d;
- char c;
- int i;
- };
- printf("%d\n", sizeof(struct S3));
- //练习4-结构体嵌套问题
- struct S4
- {
- char c1;
- struct S3 s3;
- double d;
- };
- printf("%d\n", sizeof(struct S4));
此时会出现著名的结构体内存对齐!!!划重点
要知道如何计算结构体对齐数,我们需要知道结构体对齐规则
例2:
例三例四也是同理!!
这里我们介绍了结构体类型!!!
希望大家都能完美掌握!!!