结构体
结构体也属于数据类型,构造类型,多个基本数据类型组合而成的构造类型
c
struct Person{
int age;
double height;
char *name;
};
struct Person p = {10,12.6,"nicheng"};
// 给成员赋值和访问成员
p.age = 30;
int a = p.age;1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
结构体错误的初始化方式
c
// 不能初始化的方式
struct Person p;
p = {10,12.6,"nicheng"}; // 这样会报错,因为p现在相当于结构体的地址.也就是结构体第一位属性的地址,比如
p相当于int age的地址,并不是结构体1
2
3
4
2
3
4
结构体的内存分析
- 在定义类型的时候没有分配存储空间
- 结构体的大小根据内部成员的大小进行分配,《这里会有内存对齐的,结构体所占空间 必须是 最大成员字节数的倍数》
定义结构体的三种方式
定义类型再定义变量
c
struct Person{
int age;
double height;
char *name;
};
struct Person p;1
2
3
4
5
6
2
3
4
5
6
定义类型的同时定义变量
c
struct Person{
int age;
double height;
char *name;
}p;1
2
3
4
5
2
3
4
5
定义类型的同时定义变量(省略类型名称,相比之前两种缺点 不能够重用)
c
struct{
int age;
double height;
char *name;
}p;1
2
3
4
5
2
3
4
5
类型的作用域:结构体类型的作用域,从定义类型的开始到代码块的结束,如果定义全局类型,跟全局变量生命周期一样
结构体数组
c
struct Person{
int age;
char *name;
};
struct Person pers[] = {
{1,"jack"},
{2,"tony"}
};
// 错误赋值方法,修改结构体数组里面的值不能这样改,因为取出来的是结构体的指针,只能初始化的时候这样设置
pers[0] = {3,"jackma"}; // 注意事项
// 正确的赋值方式
pers[0].age = 3;1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
指向结构体的指针
c
获取结构体内变量的方式
struct Student{
int age;
int no;
};
struct Student stu = {20,10};
struct Student *p; //指向结构体的指针
p = &stu;
// 第一种访问结构体成员变量的属性方式
printf("no = %d , age = %d \n",stu.no,stu.age);
// 第二种
printf("no = %d , age = %d \n",(*p).no,(*p).age);
// 第三种 这里为什么要用->,因为p是指向结构体的指针,并不是定义的结构体变量,做区分
printf("no = %d , age = %d \n",p->no,p->age);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
结构体与函数
如果只是把结构体传给函数,函数内的结构体更改不会改变原来的结构体变量的值,如果传的是结构体指针,会改变原来结构体变量的值
c
struct Student{
int age;
};
void testStruct(struct Student stu){ //这里只是赋值关系,没有传指针过来,会开辟一个新的内存给结构体
stu.age = 10;
}
void testStruct2(struct Student *stu){ // 这里传的是指针,所以值会改
stu->age = 10;
}
int main(){
struct Student stu = {20};
testStruct(stu);
printf("age = %d \n",stu.age);
testStruct2(&stu);
printf("age = %d \n",stu.age);
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
结构体嵌套
不允许结构体嵌套自己,可以嵌套别的结构体
c
struct Student{
int age;
};
struct Person {
char *name;
struct Student stu;
};
int main(){
struct Person p = {"jack",{10}};
printf("age = %d",p.stu.age);
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15