跳转到内容

C 语言结构体定义

来自代码酷
Admin留言 | 贡献2025年4月29日 (二) 04:46的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

C语言结构体定义[编辑 | 编辑源代码]

简介[编辑 | 编辑源代码]

在C语言中,结构体struct)是一种用户自定义的数据类型,它允许将多个不同类型的变量组合成一个单一的复合数据类型。结构体常用于表示现实世界中的实体,例如学生、员工或商品等,这些实体通常由多个属性组成。结构体的定义提供了一种将这些属性组织在一起的有效方式。

基本语法[编辑 | 编辑源代码]

结构体的定义使用关键字 struct,后跟结构体的名称和一对花括号 {},花括号内包含成员变量的声明。基本语法如下:

struct 结构体名称 {
    数据类型 成员1;
    数据类型 成员2;
    // 更多成员...
};

示例:定义一个学生结构体[编辑 | 编辑源代码]

以下是一个简单的结构体定义示例,表示一个学生的信息:

#include <stdio.h>

// 定义结构体
struct Student {
    char name[50];
    int age;
    float gpa;
};

int main() {
    // 声明结构体变量
    struct Student student1;

    // 赋值
    strcpy(student1.name, "Alice");
    student1.age = 20;
    student1.gpa = 3.8;

    // 输出
    printf("Name: %s\n", student1.name);
    printf("Age: %d\n", student1.age);
    printf("GPA: %.2f\n", student1.gpa);

    return 0;
}

输出:

Name: Alice
Age: 20
GPA: 3.80

解释[编辑 | 编辑源代码]

1. 定义了一个名为 Student 的结构体,包含三个成员:name(字符串)、age(整数)和 gpa(浮点数)。 2. 在 main 函数中,声明了一个 struct Student 类型的变量 student1。 3. 使用 strcpy 函数为 name 赋值,直接为 agegpa 赋值。 4. 最后打印结构体的成员值。

结构体的嵌套[编辑 | 编辑源代码]

结构体可以嵌套,即一个结构体的成员可以是另一个结构体。这在表示复杂数据时非常有用。

示例:嵌套结构体[编辑 | 编辑源代码]

以下示例定义了一个 Address 结构体,并将其作为 Employee 结构体的成员:

#include <stdio.h>

// 定义地址结构体
struct Address {
    char street[100];
    char city[50];
    int zipCode;
};

// 定义员工结构体,嵌套 Address
struct Employee {
    char name[50];
    int id;
    struct Address address; // 嵌套结构体
};

int main() {
    // 声明并初始化 Employee 变量
    struct Employee emp1 = {
        "Bob Smith",
        101,
        {"123 Main St", "New York", 10001}
    };

    // 输出
    printf("Name: %s\n", emp1.name);
    printf("ID: %d\n", emp1.id);
    printf("Address: %s, %s, %d\n", 
           emp1.address.street, 
           emp1.address.city, 
           emp1.address.zipCode);

    return 0;
}

输出:

Name: Bob Smith
ID: 101
Address: 123 Main St, New York, 10001

解释[编辑 | 编辑源代码]

1. 定义了一个 Address 结构体,包含街道、城市和邮编。 2. 定义了一个 Employee 结构体,其中嵌套了 Address 结构体。 3. 在 main 函数中,初始化了一个 Employee 变量 emp1,并打印其信息。

结构体的内存布局[编辑 | 编辑源代码]

结构体的成员在内存中是连续存储的,但可能会因为对齐(alignment)而存在填充字节。了解结构体的内存布局有助于优化程序性能。

示例:结构体的大小[编辑 | 编辑源代码]

以下代码展示了如何计算结构体的大小:

#include <stdio.h>

struct Example {
    char a;    // 1 byte
    int b;     // 4 bytes
    double c;  // 8 bytes
};

int main() {
    printf("Size of struct Example: %zu bytes\n", sizeof(struct Example));
    return 0;
}

输出(可能因平台而异):

Size of struct Example: 16 bytes

解释[编辑 | 编辑源代码]

由于内存对齐的要求,编译器可能会在 char aint b 之间插入填充字节,以确保 int b 从4字节对齐的地址开始。因此,结构体的总大小可能大于各成员大小的简单相加。

实际应用案例[编辑 | 编辑源代码]

结构体在以下场景中非常有用: 1. 数据库记录:表示表中的一行数据。 2. 图形编程:表示点(Point)、矩形(Rectangle)等几何图形。 3. 文件处理:存储文件的元数据(如文件名、大小、修改日期)。

示例:图形编程中的点[编辑 | 编辑源代码]

以下代码定义了一个表示二维点的结构体,并计算两点之间的距离:

#include <stdio.h>
#include <math.h>

struct Point {
    float x;
    float y;
};

float distance(struct Point p1, struct Point p2) {
    return sqrt(pow(p2.x - p1.x, 2) + pow(p2.y - p1.y, 2));
}

int main() {
    struct Point pointA = {1.0, 2.0};
    struct Point pointB = {4.0, 6.0};

    printf("Distance between A and B: %.2f\n", distance(pointA, pointB));
    return 0;
}

输出:

Distance between A and B: 5.00

解释[编辑 | 编辑源代码]

1. 定义了一个 Point 结构体,包含 xy 坐标。 2. 编写了一个 distance 函数,计算两点之间的欧几里得距离。 3. 在 main 函数中初始化两个点并计算距离。

总结[编辑 | 编辑源代码]

结构体是C语言中强大的工具,用于将多个不同类型的数据组合成一个逻辑单元。通过结构体,可以更清晰地表示复杂数据,并提高代码的可读性和可维护性。