在C语言中,有字符(char)、小数(float)、整数(int)等数据类型。但在现实生活中事务的属性远比数据类型复杂得多。比如一个人的属性就有:
身高、体重、年龄、姓名、资产等属性。那么该如何去表示这些属性呢?

C语言允许将字符(char)、小数(float)、整数(int) 等不同的类型结合成一个类型。而这个整体就叫结构类型。

结构类型的语句块内可以声明各种类型的属性语句,而这也被称为结构体。


结构体的定义:


[结构类型] [结构名] { 语句; };

struct point{
    int x;
    int y;
};


声明结构体变量的两种方法:


首先,定义了结构体肯定是需要拿来使用的是吧。
那么就可以声明1个结构体变量。

声明格式:
[结构类型] [结构名] [变量名];
或者在定义结构体时,在花括弧后加入变量,如:
[结构类型] [结构名] { 语句; }变量名;

void main(){
    struct point p1;
}
struct point{ }p1;


使用结构体:


此时。结构体内的属性不是实例(空值),它们都是抽象的。
有了结构体的变量,我们就可以给结构体里的属性(数据)进行赋初始值或者一系列操作。
如: 结构体变量名.属性;结构体变量名.属性=100; 即可访问其中的值和进行赋值。

#include <stdio.h>
void main(){
    struct point p1;
    p1.x = 10;
    p1.y = 20;
   printf("x = %d y = %d",p1.x,p1.y); 
}

运行输出:x = 10 y = 20


嵌套结构体的使用:


同时,结构体也可以进行嵌套,如以下这样子。

#include <stdio.h>
struct point2{
    int z;
};
struct point{
    int x;
    int y;
    struct point2 p2;
};
void main(){
    struct point p1;
    p1.x = 10;
    p1.y = 20;
    p1.p2.z = 30;
    printf("x = %d y = %d z = %d",p1.x,p1.y,p1.p2.z);
}

运行结果:x = 10 y = 20 z = 30

结构体形参:


结构类型除了能作为一个结构体来使用,也可以作用于函数的形参。

#include <stdio.h>

struct point2{
    int z;
    int r;
};
struct point{
    int x;
    int y;
    struct point2 p2;
};
void setStruct(struct point p){
    p.p2.r = 60;
    printf("r = %d, ",p.p2.r);
    
}
void main(){
    struct point p1;
    p1.x = 10;
    p1.y = 20;
    p1.p2.z = 30;
    setStruct(p1);
    printf("x = %d, y = %d, z = %d",p1.x,p1.y,p1.p2.z);
}

运行结果:r = 60, x = 10,y = 20, z = 30


笔记结尾:使用结构体时需要注意事项

1.性能优化

结构体,在定义时会在内存中开辟一段有限的内存空间。
因为C语言是按代码执行顺序和数据类型来分配内存空间。所以,如果定义的结构体那块有限空间中超出,那编译器则会再自动补上几块新的空间。可能会造成过多的资源浪费。

结构体内声明的数据类型,最好按同类型顺序排列。这样能通过有序开拓空间来控制资源的浪费。

结构体错误❌定义方式:

struct point{
    int a[10];
    char a;
    char b[5];
    char c;
    int b[5];
};

结构体正确✔定义方式:

struct point{
    int a[10];
    int b[5];
    char a[5];
    char b[5];
    char c;    
};