指向位置是不可知的、随机的、不正确的、没有明确限制的指针就叫野指针
比如,如果你定义指针时未对其进行初始化赋值,则这个指针指向的位置是随机的,这就是一个野指针
进入正题
在C语言中,结构体(struct
)是一种用户自定义的数据类型,它允许将不同类型的数据组合在一起。结构体可以包含基本数据类型(如整数、浮点数、字符等)以及其他结构体(这应该就是说可以套娃)
结构体的主要用途是将相关的数据组合在一起,以便更好地组织和管理数据
定义结构体
结构体的定义使用关键字 struct
// 定义一个结构体
struct Student {
char name[50];
int age;
float grade;
};
int main() {
// 创建一个结构体变量
struct Student student1;
// 为结构体成员赋值
strcpy(student1.name, "Alice");
student1.age = 20;
student1.grade = 88.5;
}
第一点,结构体的定义通常是在 main
函数外部进行的。这是因为结构体的定义需要在使用它们之前完成,以便编译器能够识别该结构体的类型(你用int定义一个变量,你总得让编译器先知道什么是int吧)
也即结构体需要先定义后使用。同时,如果你在main函数内部定义结构体,那么这个结构体仅main函数可使用
第二点,在C语言中,结构体的定义实际上是一个类型的声明。根据C语言的语法规则,所有的类型声明(包括结构体、联合体、枚举等)都必须以分号结束。这是为了明确表示类型定义的结束
struct Student {
char name[50];
int age;
float grade;
}; // 这里的分号是必须的
第三点,定义完一个结构体后,结构体类型的变量的声明
struct Student student1; // 声明一个结构体变量,这也是结构体的实例化
其中,struct Student为数据类型(你定义的,帅吧),student1是变量名
第四点,结构体变量的初始化
struct Student student2 = {"Alice", 20, 85.5}; // 初始化结构体变量
在C语言中,初始化结构体变量时需要按照结构体成员的定义顺序进行初始化
如果你只初始化了部分结构体成员,那么未初始化的成员将被默认初始化为零(对于基本数据类型)或空字符串(对于字符数组)
这同数组的初始化,也很人性
// 也使用指定成员初始化(C99及以上标准可用),这样可以更清晰地指定每个成员的值
struct Student student1 = {.name = "Bob", .age = 22, .grade = 90.0};
//但是别忘记点运算符 ( . )
第五点,对结构体成员进行赋值
你可以使用点运算符(.
)来直接访问结构体的成员并进行赋值
student1.age = 20; // 赋值整数
student1.grade = 90.5; // 赋值浮点数
//变量名(数据类型是对应的结构体)+ . +结构体成员
但是,这里记住,还是那个数组赋值的错误,你不能直接用=来赋值字符串
因为字符串本质就是个字符变量的数组
strcpy(student1.name, "Alice"); // 赋值字符串
使用strcpy函数就行了
第六点,对结构体成员进行访问
// 输出结构体成员
printf("Name: %s\n", student1.name);
printf("Age: %d\n", student1.age);
printf("Grade: %.2f\n", student1.grade);
C语言中的结构体实例化
在C语言中,你也可以在定义结构体的同时实例化结构体变量。例如:
struct Point {
int x;
int y;
} p1; // 这里直接在分号前面实例化了结构体变量 p1
你也可以在定义结构体后再实例化:
struct Point {
int x;
int y;
};
struct Point p2; // 这里在分号后面实例化了结构体变量 p2
//这是11月16号我看到的一个选择题,有点实力
Comments NOTHING