文章

C 结构体

C 结构体

结构是一种将多个相关变量组合到一个位置的方法。 结构中的每个变量都称为结构的成员。

array 不同,结构可以包含许多不同的数据类型(intfloatchar 等)。

创建结构

您可以使用 struct 关键字创建结构,并在花括号内声明其每个成员:

1
2
3
4
struct MyStructure {   // 结构声明
    int myNum;           // 成员(int 变量)
    char myLetter;       // 成员(char 变量)
}; // 用分号结束结构

想要访问这个结构,需要创建一个该结构类型的变量。

创建变量时,需要用到struct关键字,后面跟结构的名称,再跟着结构变量的名称:

1
2
3
4
5
6
7
8
9
struct myStructure {
    int myNum;
    char myLetter;
};

int main() {
    struct myStructure s1;
    return 0;
}

访问结构成员

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 创建一个名为 myStructure 的结构
struct myStructure {
    int myNum;
    char myLetter;
};

int main() {
    // 创建一个名为 s1 的 myStructure 结构变量
    struct myStructure s1;
    // 创建一个名为 s2 的 myStructure 结构变量
    struct myStructure s2;

    // 为不同的结构变量赋值
    s1.myNum = 13;
    s1.myLetter = 'B';

    s2.myNum = 23;
    s2.myLetter = 'X';

    // 打印值
    printf("s1 number: %d\n", s1.myNum);
    printf("s1 letter: %c\n", s1.myLetter);

    printf("s2 number: %d\n", s2.myNum);
    printf("s2 letter: %c\n", s2.myLetter);

    return 0;
}

复制结构

s1结构变量的值赋给s2

1
2
3
4
5
6
7
8
9
struct myStructure {
    int myNum;
    char myLetter;
    char myString[30];  // String
};

struct myStructure s1 = {13, 'B', "Some text"};
struct myStructure s2;
s2 = s1;

结构中的字符串

请记住,C 中的字符串实际上是一个字符数组,所以不能像以下方式那样直接复制:

1
2
3
4
5
6
7
8
int main() {
    struct myStructure s1;

    // 错误做法:尝试直接给字符串赋值
    s1.myString = "Some text";

    return 0;
}

这个时候会编译报错:

1
2
3
4
.\c_structs.c: In function 'main':
.\c_structs.c:14:15: error: assignment to expression with array type
   14 |   s1.myString = "Some text";
      |  

这时候正确的做法是使用strcpy()函数去进行字符串赋值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string.h>

int main() {
    struct myStructure s1;

    // 使用 strcpy 函数为字符串赋值
    strcpy(s1.myString, "Some text");

    // 打印值
    printf("My string: %s", s1.myString);

    return 0;
}

// 输出结果
// Some text

使用strcpy()函数时,必须要引用<string.h>头文件

或者在声明变量时就直接对字符串进行赋值,这样就省去了复制字符串的步骤:

1
2
3
4
5
6
7
8
9
int main() {
    // 创建一个结构变量并为其赋值
    struct myStructure s1 = {13, 'B', "Some text"};

    // 打印值
    printf("%d %c %s", s1.myNum, s1.myLetter, s1.myString);

    return 0;
}

修改值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
struct myStructure {
    int myNum;
    char myLetter;
    char myString[30];
};

int main() {
    // 创建一个结构变量并为其赋值
    struct myStructure s1 = {13, 'B', "Some text"};

    // 创建另一个结构变量
    struct myStructure s2;

    // 修改值
    s1.myNum = 30;
    s1.myLetter = 'C';
    strcpy(s1.myString, "Something else");

    // 打印值
    printf("%d %c %s\n", s1.myNum, s1.myLetter, s1.myString);

    // 将 s1 值复制到 s2
    s2 = s1;

    // 更改 s2 值
    s2.myNum = 60;
    s2.myLetter = 'X';
    strcpy(s2.myString, "Something other");

    // 打印值
    printf("%d %c %s\n", s2.myNum, s2.myLetter, s2.myString);

    return 0;
}
本文由作者按照 CC BY 4.0 进行授权