下面详细讲解“C语言基础教程(我的C之旅开始了)[五]”的完整攻略。
标题
C 语言基础教程(我的 C 之旅开始了)[五]
概述
本次教程主要涵盖C语言中的结构体和联合体。在学习本篇教程前,需要先掌握C语言中的变量、循环、条件语句、指针等基础知识。
结构体
结构体是 C 语言中自定义的一种数据类型,通过结构体可以将多个不同类型的变量组合成一个整体,方便统一管理和使用。结构体定义的方式如下:
struct [结构体名]
{
[成员变量1类型] [成员变量1名];
[成员变量2类型] [成员变量2名];
...
[成员变量n类型] [成员变量n名];
};
其中,[成员变量]可以是其他任意合法的数据类型,例如 int、char、float等。下面是一个结构体的示例:
struct student
{
int id;
char name[20];
int age;
float score;
};
结构体的使用
定义结构体之后,可以通过以下方式声明结构体变量:
struct student stu1;
struct student stu2 = {1, "张三", 18, 89.5};
struct student stu3 = {.name = "李四", .score = 77.5};
通过点运算符可以访问结构体的成员变量,例如:
stu1.id = 1;
strcpy(stu1.name, "张三");
stu1.age = 18;
stu1.score = 89.5;
结构体还可以作为函数的形参和返回值,例如:
struct student getStudent(int id, char name[], int age, float score)
{
struct student stu;
stu.id = id;
strcpy(stu.name, name);
stu.age = age;
stu.score = score;
return stu;
}
联合体
联合体是一种特殊的结构体,它所有成员都是从同一块内存中分配的,因此联合体只能存储其中任意一个成员。联合体定义的方式如下:
union [联合体名]
{
[成员变量1类型] [成员变量1名];
[成员变量2类型] [成员变量2名];
...
[成员变量n类型] [成员变量n名];
}
下面是一个联合体的示例:
union number
{
int i;
float f;
};
可以通过以下方式声明联合体变量并访问:
union number n;
n.i = 10;
printf("%d\n", n.i);
n.f = 3.14;
printf("%f\n", n.f);
printf("%d\n", n.i);
这段代码中,先将 n.i 赋值为 10,然后将 n.f 赋值为 3.14。由于 n 的内存空间只有 4 个字节,所以在将 n.f 的值赋给 n.i 时,n.i 的值会发生改变。
示例说明
示例 1
假设需要设计一个学生成绩管理系统,每个学生有学号、姓名、年龄和成绩四个属性。定义一个结构体,然后通过动态内存分配的方式创建一个包含 3 个学生信息的数组,然后输出这个数组中每个学生的信息和总成绩。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
int id;
char name[20];
int age;
float score;
};
int main()
{
struct student *stuArr;
int i, n = 3;
float sum = 0;
stuArr = (struct student *)malloc(sizeof(struct student) * n);
for (i = 0; i < n; i++)
{
printf("请输入第 %d 个学生的学号、姓名、年龄和成绩:", i + 1);
scanf("%d %s %d %f", &stuArr[i].id, stuArr[i].name, &stuArr[i].age, &stuArr[i].score);
sum += stuArr[i].score;
}
for (i = 0; i < n; i++)
{
printf("第 %d 个学生的信息:\n", i + 1);
printf("学号:%d\n", stuArr[i].id);
printf("姓名:%s\n", stuArr[i].name);
printf("年龄:%d\n", stuArr[i].age);
printf("成绩:%0.2f\n", stuArr[i].score);
}
printf("总成绩:%0.2f\n", sum);
free(stuArr);
return 0;
}
运行结果:
请输入第 1 个学生的学号、姓名、年龄和成绩:1001 张三 18 89.5
请输入第 2 个学生的学号、姓名、年龄和成绩:1002 李四 19 77.5
请输入第 3 个学生的学号、姓名、年龄和成绩:1003 王五 20 94.0
第 1 个学生的信息:
学号:1001
姓名:张三
年龄:18
成绩:89.50
第 2 个学生的信息:
学号:1002
姓名:李四
年龄:19
成绩:77.50
第 3 个学生的信息:
学号:1003
姓名:王五
年龄:20
成绩:94.00
总成绩:261.00
示例 2
假设需要设计一个数据类型转换程序,实现将整数、浮点数、字符等各种数据类型的值转换成字符串类型。由于不同类型的值要求显示的格式不同,因此可以使用联合体来存储各种类型的值。下面是这个程序的基本思路:
- 定义一个 union 类型 str,其中包含一个 char 数组 strArr 和一个整型变量 len,分别用来存储字符串和字符串的长度。
- 定义一个函数,它根据传入的数据类型将其值转换成字符串并存储到 str 变量中。具体转换方法如下:
- int 类型:使用 sprintf 函数将其转换为字符串。
- float 类型:使用 sprintf 函数将其转换为字符串,但需要指定格式为 "%.2f",表示保留 2 位小数。
- char 类型:直接将其赋值给 strArr 数组,同时将 len 变量赋值为 1。
- 其他类型:提示用户输入一个字符串,并将其赋值给 strArr 数组,并将 len 变量设为字符串的长度。
- 在主函数中分别测试各种类型的值的转换结果。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLEN 100
union str
{
char strArr[MAXLEN];
int len;
};
void convertToInt(int num, union str *s)
{
sprintf(s->strArr, "%d", num);
s->len = strlen(s->strArr);
}
void convertToFloat(float num, union str *s)
{
sprintf(s->strArr, "%.2f", num);
s->len = strlen(s->strArr);
}
void convertToChar(char c, union str *s)
{
s->strArr[0] = c;
s->len = 1;
}
void convertToString(char *str, union str *s)
{
strcpy(s->strArr, str);
s->len = strlen(s->strArr);
}
int main()
{
union str s;
int num = 123;
convertToInt(num, &s);
printf("%s\n%d\n\n", s.strArr, s.len);
float fnum = 3.1415926;
convertToFloat(fnum, &s);
printf("%s\n%d\n\n", s.strArr, s.len);
char c = 'a';
convertToChar(c, &s);
printf("%s\n%d\n\n", s.strArr, s.len);
char str[MAXLEN];
printf("请输入一个字符串:");
scanf("%s", str);
convertToString(str, &s);
printf("%s\n%d\n\n", s.strArr, s.len);
return 0;
}
运行结果:
123
3
3.14
5
a
1
请输入一个字符串:hello
hello
5
总结
本篇教程介绍了 C 语言中的结构体和联合体,讲解了它们的定义、声明和使用方法,并通过两个示例展示了它们在实际程序中的应用。同时,还向大家推荐了动态内存分配的方法。希望大家能够掌握这些知识并在实践中进行多次练习,提升自己的编程能力。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C 语言基础教程(我的C之旅开始了)[五] - Python技术站