25、结构体注意事项

1、声明结构体变量方式
1.1、定义类型的同时定义变量(省略了类型名称)
1
2
3
4
struct{
int age;
char* name;
} p;
  • 缺点: 代码复用性不高
1.2、先定义类型,再定义变量
1
2
3
4
5
struct Person{
int age;
char* name;
};
struct Person p1;
1.3、定义类型同时定义变量
1
2
3
4
struct Person{
int age;
char* name;
} p1;
2、结构体变量之间的赋值是值拷贝
2.1、代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
int main()
{
struct Person
{
int age;
char* name;
};
struct Person p1 = {.age=18,.name="xiaobei"};
struct Person p2;
p2 = p1;
printf("p1.age=%d\tp1.name=%s\n",p1.age,p1.name);
printf("p2.age=%d\tp2.name=%s\n",p2.age,p2.name);
p1.name = "xiaoming";
printf("p1.age=%d\tp1.name=%s\n",p1.age,p1.name);
printf("p2.age=%d\tp2.name=%s\n",p2.age,p2.name);
printf("====================结构体变量内存地址===================\n");
printf("p1=%p\n",&p1);
printf("p1.age=%p\n",&p1.age);
printf("p1.name=%p\n",&p1.name);

printf("p2=%p\n",&p2);
printf("p2.age=%p\n",&p2.age);
printf("p2.name=%p\n",&p2.name);
return 0;
}
2.2、运行结果

运行结果

2.3、总结

由于结构体变量p1和p2的内存地址不同,因此只能是值传递

3、结构体类型作用域
3.1、源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>

void test()
{
struct Person
{
int age;
char* name;
};
}

int main()
{
test();
struct Person p1;
return 0;
}
3.2、运行结果

运行结果

3.3、总结

结构体也是有作用域,从定义类型的那一行开始,一直到代码块结束

4、结构体变量
4.1、源码
1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main()
{
struct Person
{
int age;
char* name;
};
struct Person p;
p = {.age=18,.name="xiaobei"};
return 0;
}
4.2、运行结果

运行结果

4.3、总结

之所以报错是因为结构体变量p的内存地址是指向age的,因此,不能够这样赋值,必须在声明时才能