声明结构的形式
正常声明结构 声明「declaration」
struct point { // point代表了类型声明, 是类型的名字
int x = 0;
int y = 0;
}; // 记得加; 因为说到底只是一条语句
struct point p1,p2; // [int] [a,b]-->[struct date] [p1,p2]
⭐️新标准允许在结构中赋初值,并且只能用 =
不能用 ()
无名结构
struct { // 没有类型名称, 作为无名结构, 应该是为了快速使用
int x;
int y;
} p1,p2; // p1,p2是两个变量
同时做声明结构与定义
struct point { // point代表了类型声明, 是类型的名字
int x;
int y;
} p1,p2; // 方法一的拓展, 同时做了两件事, 声明和定义
结构变量
定义与初始化
方法一
struct point p1 = {12,24}; // 按照point里含有的顺序来的
方法二
struct point p1 = {.y=24, .x=12}; // 按照有的名字给
- 按顺序给, 你没给的就是0
访问结构成员
结构用”结构变量.结构成员”来访问 好好想清楚这几个词: 结构类型 结构变量 结构成员
结构运算
可以直接把 结构变量 过来赋值
p1=(struct point){12,24}; // 相当于p1.x=12; p1.y=24;
p1=p2; // 相当于p1.x=p2.x; p1.y=p2.y;
这是一个深复制
结构数组
我单独强调一下,其实这个归进结构变量的,但是怕忘记
你可以令一个数组,数组的每个元素是这样的结构变量
struct date dates[100];
struct date dates[] = {
{4,5,2005},{2,4,2005}};
结构指针
与数组不同, 结构变量的名字并不是结构变量的地址, 必须使用 & 运算符
struct date *pDate = &today;
引用成员 →
我们知道如果要访问结构指针的所指的变量的成员, 要这么写:
(*pDate).month
但c语言给我们了一个更好的方案:
p->month
p所指向的(变量的)成员
ok, 去看👇下面的结构与函数, 看看结构指针的其他用法
结构的嵌套
struct point {
int x;
int y;
};
struct rectangular {
struct point p1;
struct point p2;
};
struct rectangular r,*rp;
rp=&r;
r.p1.x; // (r.p1).x;
rp->p1.x; // (rp->p1).x;
// 没有 rp->p1->x; 的说法
结构与函数
结构可以作为函数的参数
int calDis(struct point p1, struct point p2)
- 与数组不一样, 就是堂堂正正的变量, 拿去用了就是新建一个放
- 也可以返回一个结构变量
结构指针作为函数的参数
struct point {
int x;
int y;
};
struct point *getStruct(struct point *p);
void output(struct point p);
void print(struct point *p);
int main() {
struct point m = {0, 0};
getStruct(&m);
output(m); // 给一个, 出一个
output(*getStruct(&m)); // 给完立马出
getStruct(&m)->x=0;
output(m); // 给完但把x改为0再出
*getStruct(&m) = (struct point){1, 2};
print(&m); // 给啥我都改成1,2出
return 0;
}
struct point *getStruct(struct point *p) {
scanf("%d", &p->x);
scanf("%d", &p->y);
return p;
} // 为什么要以指针返回, 为了可以再次参加运算
void output(struct point p) {
printf("%d, %d\n", p.x, p.y);
}
void print(struct point *p) {
printf("%d, %d\n", p->x, p->y);
}
好好品一下那些对getStruct的运算 这个函数的返回值是个地址, 而地址就绑定了变量 (我就说这么多)