一、什么是结构体
如果要一下子记录很多条数据,咱们一般都会想到用数组,比如记录一个班的学生的成绩。
但是数组有个限制:元素必须是同一数据类型。
如果我们想同时记录一个人的姓名(字符串)、年龄(整型)、身高(浮点型)等信息时,数组就派不上用场了,这时候就要用到结构体。
结构体(struct)内的元素可以有不同的数据类型,它把各路英雄好汉集结到一块儿,组成一队,抱团取暖。这也正是其名字的含义:“结”在一起,“构”成一“体”。
二、结构体的定义
结构体的一般定义形式为:
struct 结构体名{
类型名1 成员名1;
类型名2 成员名2;
……
类型名n 成员名n;
};
我们一般把结构体中的元素称为“成员”,这些成员的定义就和定义普通变量的方法一样。结构体就是拉了一伙“成员”,组成个大家庭,这个大家庭的名字由大括号前的结构体名定义。
比如我们定义一个人:
struct Person {
char name[50]; //名字
int age; //年龄
float height; //身高
};
Person就是结构体的名字,Person这个“大家庭”里面有三个成员:name、age、height。
试想一下,如果不用结构体,我们得分别定义多个变量,使用起来既不方便也不直观。有了结构体,组成了大家庭,以后就可以以家庭为单位一次性存储所有信息,是不是很方便?
三、结构体变量的定义
定义结构体只是定义了一种数据类型,就和int一样,并不是变量。比如前面定义的Person只是定义了名字为Person的结构体类型。虽然写了一大堆,但系统并不会为其分配存储空间,因为还没定义变量。只有当定义了结构体变量时,系统才会分配存储空间给该变量。
要定义结构体变量,有以下几种方式:
1.分开定义:先定义结构体类型,再定义变量
比如在定义了前面的Person后,加上一行:
struct Person hero;
它定义了一个结构体变量,变量名为hero。
我们还可以在定义hero时一并进行初始化:
struct Person hero = {"Iron Man", 47, 180.5};
注意,这种用大括号{}的初始化方式只能在定义变量的同时进行,就和数组的初始化是一样的。你不能再定义变量后再用这种方式赋值,比如下面的代码就是错误的:
struct Person hero;
hero = {"Iron Man", 47, 180.5};
2.合并定义:定义结构体类型的同时定义变量
将定义结构体类型和变量合在一处:
struct Person {
char name[50]; //名字
int age; //年龄
float height; //身高
} hero;
因为已经定义了结构体变量,hero与它上面的结构体自然地捆绑在一起,所以这种情况还可以把结构体类型的名字Person省略掉。
四、结构体赋值
1.结构体元素的赋值
结体体内元素的访问形式为:结构体变量名.成员名
如定义了前面的结构体变量hero后,就可以通过hero.name、hero.age、hero.height的方式访问并赋值了。
struct Person {
char name[50]; //名字
int age; //年龄
float height; //身高
};
struct Person hero;
hero.age = 9527;
注:"."称为成员运算符,它在所有运算符中优先级最高。
2.结构体变量的赋值
可以像普通变量那样,对相同类型的结构体变量进行赋值:
struct Person student;
student = hero; //同一结构体变量赋值
五、结构体的注意事项
1.不允许对结构体本身递归定义
结构体中的元素类型不能是结构体本身的类型。如下面的定义是错误的:
struct Person {
char name[50]; //名字
int age; //年龄
float height; //身高
struct Person hero; //错误
};
为什么不行呢?它会像递归一样,不断地向下一层扩展结构体,却没有终止条件,因此相当于无限递归(和死循环是一个道理)。
2.结构体内可以包含其它结构体
元素含有结体本身会无限扩展,但含有其他结构体就不存在这个问题了,因此是可以的。
比如:
struct Date {
int year;
int month;
int day;
};
struct Person {
char name[50]; //名字
int age; //年龄
float height; //身高
struct Date birthday;
};
六、结构体数组
1.定义
像定义普通类型的数组一样,也可以定义结构体数组:
struct Person {
char name[50]; //名字
int age; //年龄
float height; //身高
};
struct Person hero[5];
当然也可以采用前面讲的合并定义形式:
struct Person {
char name[50]; //名字
int age; //年龄
float height; //身高
} hero[5];
2.初始化
struct Person {
char name[50]; //名字
int age; //年龄
float height; //身高
} hero[2]={ {"Iron Man", 47, 180.5}, {"Batman", 39, 140.5}};
七、结构体作为函数参数
结构体变量和普通变量一样,可以作为函数参数。它传递的是全部成员的值,也就是将实参中成员的值一一赋值给对应的形参成员。比如:
void printPersonInfo(struct Person p) {
printf("Name: %s\n", p.name);
printf("Age: %d\n", p.age);
printf("Height: %.1f cm\n", p.height);
}
我们可以直接用下面一行代码打印hero的信息:
printPersonInfo(hero);
八、指向结构体的指针
和普通的指针定义方式基本一样,结构体指针变量的定义形式:struct 结构体名称 *指针变量名
有了指向结构体的指针,那么就有了3种访问结构体成员的方式:
①结构体变量名.成员名
② (*指针变量名).成员名
③指针变量名->成员名
示例代码:
#include<stdio.h>
int main(){
struct Person {
char name[50]; //名字
int age; //年龄
float height; //身高
};
struct Person hero = {"Iron Man", 47, 180.5};
struct Person *p; // 定义一个指向结构体的指针变量
p = &hero; // 指向结构体变量hero
//三种方式打印
printf("%s, %d, %.1f\n", hero.name, hero.age, hero.height);
printf("%s, %d, %.1f\n", (*p).name, (*p).age, (*p).height);
printf("%s, %d, %.1f\n", p->name, p->age, p->height);
return 0;
}
运行结果:
标签:hero,struct,简介,age,C语言,Person,成一,结构,定义 From: https://blog.csdn.net/jjmhx/article/details/144809735