结构体和数组的不同

数组是相同类型的集合

结构体是一些值的结合,这些值的类型可以不同

结构体嵌套

struct b
{
int number[10];
};
struct stu//定义了一个名字是stu的结构体
{
struct b;//结构体的内容也可以是另外一个结构体
char name[20];
int id[20];
}str1, str2 = { {10},"张三",20 };//这里也是定义一个结构体变量但是却是一个全局变量
//这里的str1没有被初始化,但是str2被初始化了
int main()
{
struct stu b = { {10},"张三",20 };//这里定义的是局部变量的结构体
//这里是结构体b的初始化
//这里的struct stu是‘b’的类型,而b是他的名字
return 0;
}

指针在结构体中的应用

基础语法

struct a 
{
char id[10];
};

struct stu
{
struct a sb;
int number;//如果这里写number[20]那么这里就是一个地址
char id[20];//但是这里的如果是一个字符串的话,直接打印就可以了
};

int main()
{ // 这里{}的{}的字符串必须要加""不然打印不出来
struct stu b = { {"123"},20,"123"};
struct stu* p = &b;//这里的指针必须写成结构体的名字加上*,不然会报错
//这里用名字来打印结构体里面的东西
printf("%d\n", b.number);
printf("%s\n", b.id);

printf("%d\n", p->number);//'->'表示指向也可以有结构体名字一样的效果
printf("%s\n", p->id);
printf("%s\n", p->sb.id);
//要用访问结构体里面的结构体需要用->指向大的结构体里面的小的结构体的名字,在用'.'指向结构体里面的的某些值
//printf("%s\n", p->sb->id);这样是错误的,sb不是指针类型
//用指针来打印结构体里面的东西

return 0;
}

在结构体中使用指针的优缺点

struct stu
{

int number;
char id[20];
};
void print1(struct stu t)//这个函数必须放在结构体后面,不然会报错说结构体未定义
{

printf("%d %s\n", t.number, t.id);
}
void print2(struct stu* b)
{

printf("%d %s\n", b->number, b->id);
}
int main()
{
struct stu b = { 20,"123" };
print1(b);//这里是传值调用,会占用很高的内存,结构体不可更改
print2(&b);//这里是传址调用,不会占用你很高的内存,结构体可以改变
return 0;
}