Skip to content
On this page

clang_结构体


标签:clang/basic  

C语言结构体和没有方法的类很像, 结构体的成员变量可以是其他结构体.

c
struct address { char city[50]; char street[50]; int postal_code; };
struct person { char name[50]; int age; struct address addr; };

初始化

1. 按照成员顺序初始化

c
struct person { char name[20]; int age; float height; };
struct person p1 = {"Tom", 20, 1.75};

顺序需要一一对应, 如果编辑器有提示还是不错滴.

2. 指定成员变量的初始化值

c
struct person { char name[20]; int age; float height; };
struct person p1 = {.name = "Tom", .age = 20}; // 指定成员变量的初始化值

如果没有指定的话会被自动赋值为 0 或者 NULL.

3. 分别赋值

c
struct person { char name[20]; int age; float height; };
struct person p1;
p1.name = "bob";
p1.age = 20;
p1.height = 175;

4. 输入初始化

c
struct CAR { char name[20]; int price; char color[20];} car2;
printf("请输入品牌:"); 
scanf("%s",car3.name); 
printf("请输入单价:"); 
scanf("%d",&car3.price); 
printf("请输入颜色:"); 
scanf("%s",car3.color);

上面四种是上课讲的, 实际上复杂化了, 就记住前三种即可, 4 ~ 6 都是扩展了.

5. 配合 typedef 初始化

其实就是第一种初始化方式, 但是配合 typedef 可以让代码非常简洁.

c
typedef struct { char name[20]; int age; float height; } Person;
Person p1 = {"Tom", 20, 1.75};

typedef 的名称可以和结构体的名称一样, 也可以去除结构体的名称, 如上所示.

详细的用法在 typedef 里已经写过了.

结构体指针

[!info] 笔记

指针调用结构体的成员需要使用 ->

1. 指向普通变量

c
struct person a={"李四",12,'W'};
struct person *p=&a;

2. 指向堆区地址

c
struct person *p1 = (struct person*)malloc(sizeof(struct person));
p1->age = 20;
p1->height = 1.75;
strcpy(p1->name, "Tom");

3. 指向数组地址

c
struct person arr[2]={"李四", 12, 'W', "战三", 34, 'M'};
struct person *p=arr;

嵌套结构体

c
struct person { struct date birth; char name[20]; };
struct date { int year; int month; int day; };

嵌套结构体数组

c
struct car { char color[20], int price; };
struct person { struct car cars[2]; char name[20]; };

嵌套共用体

共同体和结构体的声明很像, 但其中的内容只能有一个成员保存, 其占用内存大小是最大成员的大小. 和结构体搭配可以用在可变的属性上

c
struct person {
	char name[20];
	int age;
	union {
		int score;         // 对应学生
		char job[20];      // 对应老师
	}
};

上面的代码是一个教师和学生共用的结构体, 如果有成绩那么保存的就是学生, 如果有职位那么保存的就是教师.

[!Note] 笔记

如果不对 union 进行取名的话, 就可以直接 person.score 获取到数据, 如果有名字的话就需要 person.unionname.score 这样取得数据.

另外也可以包含之前声明过的共用体 :

c
union Pos {
	int score;
	char job[20];
};
struct person {
	union Pos pos;
};

当然这种的调用方法也必须是 per.pos.job .

结构体占用内存大小

结构体可以使用 sizeof运算符 计算其大小, 但是它的大小不是简单的成员元素的大小总和, 它循序一个 结构体字节对齐原则.

Last updated: