C语言:结构体

时间:2025-02-03 19:56:42

1. 结构体的定义

结构体的定义使用 struct 关键字,其基本语法如下:

struct 结构体名 {
    数据类型 成员1;
    数据类型 成员2;
    // 可以有更多成员
}variable-list;

例如,定义一个表示学生信息的结构体:

struct Student {
    char name[50];
    int age;
    float score;
}variable-list;

述代码定义了一个名为 Student 的结构体,它包含三个成员:一个字符数组 name 用于存储学生姓名,一个整型变量 age 用于存储学生年龄,一个浮点型变量 score 用于存储学生成绩。

2. 结构体变量的声明

定义好结构体后,可以声明该结构体类型的变量。有以下几种声明方式:

方式一:先定义结构体,再声明变量
struct Student 
{
    char name[50];
    int age;
    float score;
};

int main() 
{
    struct Student stu1; // 声明一个 Student 类型的变量 stu1
    return 0;
}
方式二:在定义结构体的同时声明变量
struct Student
 {
    char name[50];
    int age;
    float score;
} stu2; // 声明一个 Student 类型的变量 stu2

int main()
 {
    // 使用 stu2
    return 0;
}
方式三:使用匿名结构体声明变量(匿名结构体声明变量只能声明一个
struct 
{
    char name[50];
    int age;
    float score;
} stu3; // 声明一个匿名结构体类型的变量 stu3

int main() 
{
    // 使用 stu3
    return 0;
}

3. 结构体变量的初始化

 

结构体变量可以在声明时进行初始化,有以下几种初始化方式:

方式一:按成员顺序初始化
#include <stdio.h>

struct Student 
{
    char name[50];
    int age;
    float score;
};

int main() 
{
    struct Student stu = {"Alice", 20, 85.5};
    printf("姓名: %s, 年龄: %d, 成绩: %.2f\n", stu.name, stu.age, stu.score);
    return 0;
}
方式二:指定成员初始化
#include <stdio.h>

struct Student 
{
    char name[50];
    int age;
    float score;
};

int main() 
{
    struct Student stu = {.name = "Bob", .score = 90.0, .age = 21};
    printf("姓名: %s, 年龄: %d, 成绩: %.2f\n", stu.name, stu.age, stu.score);
    return 0;
}

4. 结构体成员的访问

可以使用点运算符(.)来访问结构体变量的成员。例如:

#include <stdio.h>
#include <string.h>

struct Student
 {
    char name[50];
    int age;
    float score;
};

int main()
 {
    struct Student stu;
    strcpy(stu.name, "Charlie");
    stu.age = 19;
    stu.score = 78.5;
                                            //    结构体变量.结构体成员名
    printf("姓名: %s, 年龄: %d, 成绩: %.2f\n", stu.name, stu.age, stu.score);
    return 0;
}

5.结构体数组

结构体数组是由多个相同结构体类型的元素组成的数组。例如:

#include <stdio.h>

struct Student 
{
    char name[50];
    int age;
    float score;
};

int main() {
    struct Student students[3] = {
        {"David", 22, 88.0},
        {"Eve", 20, 92.5},
        {"Frank", 21, 76.0}
    };

    for (int i = 0; i < 3; i++) 
{
        printf("姓名: %s, 年龄: %d, 成绩: %.2f\n", students[i].name, students[i].age, students[i].score);
    }
    return 0;
}

6. 结构体指针

可以定义指向结构体的指针,通过指针访问结构体成员时需要使用箭头运算符(->)。例如:

#include <stdio.h>
#include <string.h>

struct Student 
{
    char name[50];
    int age;
    float score;
};

int main() 
{
    struct Student stu = {"Grace", 23, 89.5};
    struct Student *p = &stu;

    printf("姓名: %s, 年龄: %d, 成绩: %.2f\n", p->name, p->age, p->score);
    return 0;
}

7. 结构体作为函数参数

结构体可以作为函数的参数进行传递,有值传递和地址传递两种方式。

值传递
#include <stdio.h>

struct Point 
{
    int x;
    int y;
};

// 函数接受结构体值作为参数
void printPoint(struct Point p) 
{
    printf("坐标: (%d, %d)\n", p.x, p.y);
}

int main() 
{
    struct Point pt = {3, 5};
    printPoint(pt);
    return 0;
}
地址传递
#include <stdio.h>

struct Point 
{
    int x;
    int y;
};

// 函数接受结构体指针作为参数
void modifyPoint(struct Point *p) 
{
    p->x = 10;
    p->y = 20;
}

int main() 
{
    struct Point pt = {3, 5};
    modifyPoint(&pt);
    printf("修改后的坐标: (%d, %d)\n", pt.x, pt.y);
    return 0;
}