• 【C语言】结构类型的定义和使用


    目录

    1.结构体(struct)类型 

    2.结构标记 

    3.typedef

    4.定义结构数组的方法 

    5.调用结构数组的方法 

    6.将结构体传入函数

    7.结构体使用实例


    1.结构体(struct)类型 

    在C语言中,结构体(struct)类型是一种用户自定义的复合数据类型,用于组合不同类型的数据成员在一个单独的对象中。结构体类型的定义可以包含多个数据成员,每个数据成员可以是不同的数据类型。结构体类型的语法如下:

    1. struct 结构体名 {
    2. 数据类型 成员名1;
    3. 数据类型 成员名2;
    4. // ...
    5. };

    以下是一个示例:

    1. struct student {
    2. int id;
    3. char name[20];
    4. int age;
    5. float score;
    6. };

    上述代码定义了一个名为student的结构体类型,包含了四个数据成员:idnameagescore,分别为整型、字符数组型、整型和浮点型。该结构体类型可以用于定义表示学生的对象,每个对象包括了学生的ID、姓名、年龄和分数。结构体类型创建后,需要通过声明一个结构体变量来实际分配内存,例如:

    1. struct student s; // 声明一个名为s的结构体变量,表示一个学生
    2. s.id = 1001; // 设置学生的ID为1001
    3. strncpy(s.name, "Tom", sizeof(s.name)); // 设置学生的姓名为Tom
    4. s.age = 20; // 设置学生的年纪为20
    5. s.score = 90.5; // 设置学生的分数为90.5

    2.结构标记 

    C语言中,结构标记指的是定义一个结构体类型的名称,而不是直接定义结构体变量。结构标记的声明格式如下:

    1. struct 结构体名称;

    例如,以下是一个结构标记的声明:

    struct student;
    

    这个声明定义了一个名为"student"的结构体类型,但没有定义具体的结构体成员。这是因为结构标记只是为结构体类型分配了一个名称,而没有为它分配内存空间。

    结构标记的主要作用是方便在后面的代码中使用结构体类型。可以使用结构标记名称来声明结构体变量、作为函数参数类型以及作为函数返回类型等。

    3.typedef

    C语言中,typedef是一种定义类型别名的关键字。它的用法如下:

    • 声明简单类型别名
    typedef 原类型别名 新类型别名;
    

    例如:

    1. typedef int INT;
    2. INT a = 1;

    这样将int类型的a定义为INT类型的变量。

    • 声明结构体类型别名
    typedef struct 原类型别名 新类型别名;
    

    例如:

    1. typedef struct date {
    2. int year;
    3. int month;
    4. int day;
    5. } DATE;
    6. DATE d = {2021, 10, 1};

    这样将struct date类型的d定义为DATE类型的变量。

    • 声明指针类型别名
    typedef 原类型别名 * 新类型别名;
    

    例如:

    1. typedef int * PTR_INT;
    2. int i = 1;
    3. PTR_INT ptr_i;
    4. ptr_i = &i;

    这样将int类型的指针定义为PTR_INT类型的指针变量。

    使用typedef可以使代码更加简洁易懂,提高代码的可读性。

    4.定义结构数组的方法 

    定义结构数组的方法如下:

    1. struct student {
    2. char name[20];
    3. int age;
    4. char gender;
    5. };
    6. struct student stu[3]; // 定义一个包含3个元素的结构数组

    这里定义了一个结构体 student,包含了学生的姓名、年龄和性别,然后通过结构体定义一个包含3个元素的结构数组 stu

    5.调用结构数组的方法 

    调用结构数组的方法如下:

    1. #include <stdio.h>
    2. int main() {
    3. struct student stu[3] = {
    4. {"Tom", 18, 'M'},
    5. {"Lucy", 19, 'F'},
    6. {"John", 20, 'M'}
    7. };
    8. for(int i = 0; i < 3; i++) {
    9. printf("Name: %s\n", stu[i].name);
    10. printf("Age: %d\n", stu[i].age);
    11. printf("Gender: %c\n", stu[i].gender);
    12. }
    13. return 0;
    14. }

    这里通过初始化方式给结构数组赋值,然后使用 for 循环输出每个学生的信息。在输出时使用了结构体成员连接运算符 .(点号) 来访问每个学生的姓名、年龄和性别。

    C语言中的结构体是一种自定义的数据类型,可以包含多个不同类型的数据成员。结构体的定义可以在函数内部或外部,格式为:

    1. struct 结构体名 {
    2. 数据类型 成员名1;
    3. 数据类型 成员名2;
    4. ...
    5. };

    其中,结构体名是自己定义的,可以起任何名字。成员名也可以任意取名,但要符合C语言的命名规则。

    结构体变量定义格式为:

    struct 结构体名 变量名;
    

    访问结构体成员时使用“.”操作符,格式为:

    变量名.成员名
    

    例如:

    1. struct student {
    2. char name[20];
    3. int age;
    4. float score;
    5. };
    6. int main() {
    7. struct student s1;
    8. strcpy(s1.name, "Tom");
    9. s1.age = 18;
    10. s1.score = 88.5;
    11. printf("%s's age is %d, score is %.1f\n", s1.name, s1.age, s1.score);
    12. return 0;
    13. }

    输出结果为:

    Tom's age is 18, score is 88.5
    

     

    6.将结构体传入函数

    结构体可以像其他数据类型一样传递给函数。下面是一些示例代码:

    假设有以下结构体:

    1. typedef struct Person {
    2. char name[30];
    3. int age;
    4. } Person;
    • 将结构体作为函数参数

    将结构体作为函数的参数,可以通过值传递或指针传递。

    1. void print_person(Person p) {
    2. printf("姓名:%s,年龄:%d\n", p.name, p.age);
    3. }
    4. void update_person(Person *p) {
    5. p->age += 1;
    6. }

    在这个示例代码中,我们定义了两个函数。print_person函数用于打印结构体Person中的信息,update_person函数用于修改结构体Person中的信息。print_person函数使用的是值传递,即将结构体Person的值作为参数传递给函数。update_person函数使用的是指针传递,即将结构体Person的指针作为参数传递给函数。

    • 将结构体指针作为函数参数

    如果要在函数中修改结构体的值,可以将结构体的指针作为参数传递给函数。这样可以避免在函数内部创建新的结构体副本。

    1. void update_person(Person *p) {
    2. p->age += 1;
    3. }

    在此示例代码中,我们定义了一个update_person函数,它使用了指针传递。函数使用->运算符来访问结构体中的成员。

    调用上述函数的方法如下:

    1. Person person = {"Tom", 20};
    2. print_person(person); // 输出 "姓名:Tom,年龄:20"
    3. update_person(&person);
    4. print_person(person); // 输出 "姓名:Tom,年龄:21"

    7.结构体使用实例

    利用结构体求投票数

    1. #include
    2. #include
    3. #include
    4. #define MAX_CANDIDATES 10
    5. // 候选人结构体
    6. typedef struct Candidate {
    7. char name[50]; // 候选人名字
    8. int vote_count; // 票数
    9. } Candidate;
    10. int main() {
    11. int num_candidates;
    12. Candidate candidates[MAX_CANDIDATES];
    13. // 获取候选人数量
    14. printf("请输入候选人数量(最多%d个):", MAX_CANDIDATES);
    15. scanf("%d", &num_candidates);
    16. getchar(); // 消耗输入缓冲区中的换行符
    17. // 获取候选人信息
    18. for (int i = 0; i < num_candidates; i++) {
    19. printf("请输入候选人%d的名字:", i+1);
    20. fgets(candidates[i].name, 50, stdin);
    21. candidates[i].name[strcspn(candidates[i].name, "\n")] = '\0'; // 去除输入缓冲区中的换行符
    22. candidates[i].vote_count = 0; // 初始化票数为0
    23. }
    24. // 投票
    25. while (1) {
    26. char candidate_name[50];
    27. printf("请输入你要投票的候选人名字(输入exit结束投票):");
    28. fgets(candidate_name, 50, stdin);
    29. candidate_name[strcspn(candidate_name, "\n")] = '\0';
    30. if (strcmp(candidate_name, "exit") == 0) {
    31. break;
    32. }
    33. int found = 0;
    34. for (int i = 0; i < num_candidates; i++) {
    35. if (strcmp(candidate_name, candidates[i].name) == 0) {
    36. candidates[i].vote_count++;
    37. found = 1;
    38. break;
    39. }
    40. }
    41. if (!found) {
    42. printf("没有找到名为%s的候选人,请重新输入。\n", candidate_name);
    43. }
    44. }
    45. // 输出投票结果
    46. printf("投票结果:\n");
    47. for (int i = 0; i < num_candidates; i++) {
    48. printf("%s: %d 票\n", candidates[i].name, candidates[i].vote_count);
    49. }
    50. return 0;
    51. }

    在这个例子中,我们定义了一个候选人结构体,包含了候选人的名字和票数。在程序运行时,首先获取候选人数量和候选人信息,并初始化各个候选人的票数为0。然后,利用一个循环获取用户输入的投票信息,直到用户输入exit为止。每次获取到用户输入的候选人名字后,我们遍历候选人数组,查找是否有对应的候选人。如果找到了,则给该候选人的票数加1;否则输出错误提示信息。最后,我们输出投票结果,显示每个候选人的名字和票数。

     

  • 相关阅读:
    java11中String类,StringBuffer类和StringBuilder类区别
    Qt基础 QScatterSeries
    【深度学习炼丹大杀器——mlrunner初体验(以mmdetection为例)】
    R语言将多个字符串连接起来:使用paste函数将多个字符串拼接起来(默认的分隔符为空格)、paste0函数进行字符串拼接时不使用任何分隔符
    上传 iOS App ipa安装包 【推荐使用mac】
    bluez5.50蓝牙文件传输
    WebSocket vs SSE: 实时数据推送到前端的选择与实现(详细)
    独立站饰品Facebook广告经验分享
    C++动态库调试技巧
    GCC基本使用
  • 原文地址:https://blog.csdn.net/qq_52442214/article/details/133603651