C语言之结构体和共同体——结构体的定义和使用

在实际问题中,一组数据往往具有不同的数据类型;例如在学生信息登记表中,姓名为字符型,学号为整型或字符型,年龄为整型,性别为字符型,成绩为整型或实型。因为数据类型不同,显然不能用一个数组来存放。

在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。定义结构体的一般形式为:

struct 结构体名{
    成员列表
};


每个成员都是结构体的组成部分,有名字,也有数据类型,形式为:

类型说明符 成员名;


例如用结构体来表示学生信息:

<span style="font-size:18px;">struct stu{
    char *name;  //姓名
    int num;  //学号
    char sex;  //性别
    float score;  //成绩
};</span>

结构体是一种构造数据类型(也称复杂数据类型),由若干不同类型的变量(数据)组成。每个变量都是结构体的成员(member),每个成员可以是基本数据类型,也可以是构造类型。

相应的,int、char、float 这些数据类型被称为基本数据类型。

上面的代码定义了一个结构体,名字为stu。stu由4个成员组成,分别为 name、num、sex、score。

注意大括号后面的分号;不能少。

结构体变量

结构体也是一种数据类型,可以用来说明变量。例如:

struct stu stu1, stu2;

定义了两个变量 stu1 和 stu2,它们都是 stu 类型,都由 4 个成员组成。注意关键字struct不能少。

stu 就像一个“模板”,定义出来的变量都具有相同的性质。也可以将结构体比作“图纸”,将结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的。

结构体的各个成员在内存中是连续存储的。stu1、stu2 的内存如下图所示:

你也可以在定义结构体的同时定义结构体变量:

struct stu{
    char *name;  //姓名
    int num;  //学号
    char sex;  //性别
    float score;  //成绩
} stu1, stu2;

将变量放在结构体定义的最后即可。

如果只需要 stu1、stu2 两个变量,也可以不写结构体名字:

struct{  //没有写 stu
    char *name;  //姓名
    int num;  //学号
    char sex;  //性别
    float score;  //成绩
} stu1, stu2;


这样做书写简单,但是因为没有结构体名,后面就没法用该结构体定义新的变量。

也可以用宏定义使一个符号常量来表示一个结构类型,例如:

#define STU struct stu
STU{
    char *name;  //姓名
    int num;  //学号
    char sex;  //性别
    float score;  //成绩
};
STU stu1, stu2;

后面我们会学习Windows编程,大部分结构体都是这样定义的。

成员的获取和赋值

在C语言中,使用点号.来获取结构体中的一个成员,一般格式为:

结构变量名.成员名


例如:

stu1.name;  //第一个学生的姓名
stu2.score;  //第二个学生的成绩

获取成员后,就可以对该成员进行赋值了,例如:

stu1.name = "Tom";
stu2.score = 90.5;


除了可以对成员进行逐一赋值,也可以像数组一样整体赋值,例如:

struct stu{
    char *name;  //姓名
    int num;  //学号
    char sex;  //性别
    float score;  //成绩
} stu1, stu2 = { "Tom", 10, 'M', 90 };

不过整体赋值仅限于上面这样的情况,也就是定义结构体的同时声明变量。下面的写法是错误的:

stu2 = { "Tom", 10, 'M', 90 };


一个完整的示例:

#include <stdio.h>
#define STU struct stu
int main(){
    STU{
        char *name;  //姓名
        int num;  //学号
        char sex;  //性别
        float score;  //成绩
    };
    STU stu1;
    stu1.name = "James Bond";
    stu1.num = 1;
    stu1.sex = 'M';  //用M表示男性,W表示女性
    stu1.score = 99;
    printf("Hello everyone! My name is %s, a naughty boy, but with good scores(%.2f) and top No.(%d)!", stu1.name, stu1.score, stu1.num);
    return 0;
}


运行结果:
Hello everyone! My name is James Bond, a naughty boy, but with good scores(99.00) and top No.(1)!
C语言中的结构体(struct)和共用体(union)是用于组织和管理多个不同类型的数据的机制。 结构体是由不同类型的变量组成的数据集合。它可以将不同类型的变量封装在一个单独的对象中,方便对这些变量进行操作和管理。结构体定义使用关键字struct,可以在结构体定义多个成员变量,每个成员变量可以是不同的数据类型。结构体定义通常放在函数外部,以便在程序的多个地方使用。 示例代码: ``` // 定义一个结构体 struct Person { char name[20]; int age; float height; }; // 使用结构体 int main() { // 创建一个结构体变量 struct Person person1; // 对结构体成员赋值 strcpy(person1.name, "John"); person1.age = 25; person1.height = 1.8; // 输出结构体成员 printf("Name: %s\n", person1.name); printf("Age: %d\n", person1.age); printf("Height: %.2f\n", person1.height); return 0; } ``` 共用体是一种特殊的数据类型,它允许多个不同类型的成员共用同一块内存空间。共用体的定义使用关键字union,所有成员都共享同一块内存,但只能同时使用一个成员。共用体适用于在不同的数据类型中存储相同类型的数据,节省内存空间。 示例代码: ``` // 定义一个共用体 union Data { int i; float f; char str[20]; }; // 使用共用体 int main() { union Data data; // 对共用体成员赋值 data.i = 10; // 输出共用体成员 printf("i: %d\n", data.i); // 在共用体中赋值给不同的成员 strcpy(data.str, "C programming"); printf("str: %s\n", data.str); return 0; } ``` 总结: - 结构体用于组织和管理多个不同类型的数据,每个成员有独立的内存空间。 - 共用体用于节省内存空间,多个成员共享同一块内存空间,但只能同时使用一个成员。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值