11.15 上午 初识结构体和结构体的实例化

发布于 6 天前  11 次阅读


指向位置是不可知的、随机的、不正确的、没有明确限制的指针就叫野指针

比如,如果你定义指针时未对其进行初始化赋值,则这个指针指向的位置是随机的,这就是一个野指针


进入正题

在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号我看到的一个选择题,有点实力

届ける言葉を今は育ててる
最后更新于 2024-11-16