目录
1.什么是结构体
2.输出结构体里面的成员变量
3.结构体的自引用
4.结构体变量的大小
练习:算出下列结构体大小
结构体是由一批数据组合而成的结构型数据组,成结构型数据的每个数据称为结构型数据的“成员”
例如描述一个学生,成员包含了学生的属性:姓名,年龄,电话和性别.生成了s1,s2,s3三个全局变量
下面是创建结构体变量
int main() {
//创建结构体变量 局部变量
struct Stu s = { "张三",20,"123456","女" };
return 0;
}
当然,为了方便创建,还可以使用另外一种创建形式
//可以看到,只要用Stu +xxx就能创建结构体变量了!!
int main() {
//创建结构体变量 局部变量
Stu s1 = { "张三",20,"120","女" };
return 0;
}
另外,还有一种比较特殊结构体变量------匿名结构体变量
int main() {
s.a = 11;
s.c = 'a';
printf("%d\n", s.a);
printf("%c\n", s.c);
return 0;
}
这种结构体适合只用一次的情况!!
下面声明了两个结构体,以变量.成员的形式输出数据,注意,T结构体里面又放了结构体S成员变量!!
struct S {
int a;
char c;
char arr[20];
double d;
};
struct T {
char ch[10];
struct S s;
char *pc;
};
int main() {
char arr[] = "hello sun";
struct T t = { "hehe",{100,"w","hello word",3.14}, arr };
printf("%s\n", t.ch);
printf("%s\n", t.s.arr);
printf("%lf\n", t.s.d);
printf("%s\n", t.pc);
return 0;
}
下列下面两个函数打印的形式:
一种是按照指针形式打印(结构体指针指向结构体时),打印的时候用.符号来打印是无效的;
一种是普通的值传递打印
typedef struct Stu {
//成员变量
char name[20];
short age;
char tele[12];
char sex[5];
}Stu;
void Print1(Stu s) {
printf("name: %s\n", s.name);
printf("age: %d\n", s.age);
printf("tele: %s\n", s.tele);
printf("sex: %s", s.sex);
}
void Print2(Stu* s) {
printf("name: %s\n", s->name);
printf("age: %d\n", s->age);
printf("tele: %s\n", (*s).tele);
printf("sex: %s", s->sex);
//printf("sex: %s", s.sex);//error 不可用
}
int main() {
Stu s = { "李四",40,"155","男" };
Print1(s);
Print2(&s);
return 0;
}
链表作为一种数据结构,是一种典型的自引用的结构体,
//链表形式
struct Node
{
int data;
struct Node* next;
};
int main() {
struct Node n1;
printf("%d\n",sizeof(n1)) ;
//32位平台下,指针是4个字节,所以Node结构体的大小为4+4=8个字节
//64位平台下,指针是4个字节,所以Node结构体的大小为4+4=8个字节
return 0;
}
模拟出拥有5个元素的链表
//下面代码有什么错误呢?
typedef struct {
int data;
Node* next;
}Node;
//,Node先未被定义,也就是先执行了重命名,所以报错了!!
下面这种声明是正确的!!
typedef struct Node {
int data;
struct Node* next;
}Node;
int main() {
struct Node n1;
Node n2;
return 0;
}
先看看下面的代码,计算出大小
struct S1
{
char c1;
int a;
char c2;
};
struct S2
{
char c1;
char c2;
int a;
};
int main() {
struct S1 s1 = { 0 }; //初始化
printf("%d\n", sizeof(s1));
struct S2 s2 = { 0 };
printf("%d\n", sizeof(s2));
return 0;
}
欲计算,先要对结构体的对齐规则有所了解
(1).第一个成员在与结构体变量偏移量为0的地址处,
(2)其他变量要对齐到某个他的大小(对齐数)的的整数倍的地址处
对齐数=编译器默认一个对齐数与该成员大小的较小值
我用的VS它的对其数是8
(3)最后结构体的总大小为最大对齐数(成员变量中最大的哪个!!)的整数倍
按照上述规则,分析下s1的大小
所以s1的大小为12
分析下s2的大小
所以得到s2的大小是8
struct S3
{
double d;
char c;
int i;
};struct S4
{
char c1;
struct S3 s3;
double d;
};