声明结构的形式

正常声明结构 声明「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的运算 这个函数的返回值是个地址, 而地址就绑定了变量 (我就说这么多)