基本概念
- 声明结构的形式:对于第⼀和第二种形式,都声明了结构point。但是第三种形式没有声明point,只是定义了两个变量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22(1)
struct point{
int x;
int y;
};
struct point p1,p2; // p1,p2 都是 point,里面有 x,y 的值。
(2)
struct point{
int x;
int y;
}p1,p2; // p1,p2 都是 point,里面有 x,y 的值。
(3)
struct {
int x;
int y;
}p1,p2; //p1 和 p2都是一种⽆无名结构,⾥里⾯面有x和y
一般来说,一个结构变量所占的内存空间的大小就是结构中所有成员变量大小之和。结构变量中的各个成员变量在内存中一般是连续存放的。
访问变量:
1
2p1.x
p1.y对于整个结构,可以做赋值、取地址,也可以传递给函数参数
1
2
3
4• p1 = (struct point){5, 10};
// 相当于p1.x = 5;p1.y = 10;
• p1 = p2;
// 相当于p1.x = p2.x; p1.y = p2.y;结构体指针
和数组不同,结构变量的名字并不是结构变量的地址,必须使⽤用&运算符。
1 | struct point *p = &p1; |
结构与函数
(1)结构体作为参数
1 | int function(struct point p) |
• 整个结构可以作为参数的值传⼊入函数
• 这时候是在函数内新建⼀一个结构变量,并复制调⽤用者的结构的值
• 也可以返回⼀一个结构
注意:传⼊入结构和传⼊数组是不同的:
- 函数参数传入的是数组的引用。
- 传入结构时,传入的是结构体的拷贝。
(2)结构指针作为参数
1 | struct point *p = &p1; |
⽤用**->**表⽰示指针所指的结构变量中的成员
示例:
1 |
|
• 好处是传⼊传出只是一个指针的大小。
• 如果需要保护传入的结构不被函数修改。
- const struct point *p
• 返回传⼊的指针是一种套路。
结构体数组
1 | struct point p[100]; |