【C语言结构体与共用体】是C编程语言中重要的数据类型,它们允许我们将不同类型的数据组织在一起,形成更复杂的复合数据类型。
1. **结构体类型定义**:
- **定义方法1**:可以使用`struct`关键字声明一个新的结构体类型,并在声明时创建变量。例如:
```c
struct student {
char name[12];
char sex;
struct date birthday;
float sc[4];
} std, pers[3], *pstd;
```
这里定义了一个名为`student`的结构体类型,包含了姓名、性别、生日和四门成绩等字段,并创建了对应的变量`std`, `pers[3]`数组以及指向结构体的指针`pstd`。
- **定义方法2**:直接定义结构体类型的数据,不指定结构体名称:
```c
struct {
char name[12];
char sex;
struct date birthday;
float sc[4];
} std, pers[3], *pstd;
```
这种方式同时定义了结构体类型和变量,但结构体没有名字。
- **定义方法3**:先声明结构体类型,再定义变量:
```c
struct student {
char name[12];
char sex;
struct date birthday;
float sc[4];
};
struct student std, pers[3], *pstd;
```
这里先声明了结构体类型`student`,然后创建了相应的变量。
2. **结构体数据的初始化**:
- **结构体变量初始化**:可以为结构体变量赋予初始值,值应按成员顺序放在花括号内:
```c
struct student std = {"LiMing", 'M', 1962, 5, 10, 88, 76};
```
注意,未指定的数值型和字符型成员会被默认初始化为0。
- **结构体数组初始化**:结构体数组的每个元素都是结构体,因此需要为每个元素的成员赋值:
```c
struct bookcard bk[3] = {{"No1", 35.5}, {"No2", 25.0}, {"No3", 66.7}};
```
- **结构体指针初始化**:结构体指针的初始化与普通指针类似:
```c
struct stu std, pers[3], *psd1 = &std, *psd2 = pers, (*p)[3] = &pers;
```
3. **结构体类型数据的引用**:
- **结构体成员引用**:可以通过以下三种方式访问结构体成员:
```c
std.name
pstd->name
(*pstd).name
```
其中,点号`.`用于访问成员,箭头`->`用于访问指针所指的结构体成员。
4. **结构体变量的赋值**:
- **成员赋值**:可以直接对结构体的成员进行赋值,如`std.sex = 'M';`
- **整体赋值**:两个相同类型的结构体变量可以互相赋值,如`pers[0] = std; (*pstd) = pers[0];`
5. **函数间结构体数据的传递**:
- 结构体不能作为整体传递给函数,只能传递其成员。例如:
```c
void f1(char *s) {
printf("%s\n", s);
}
void f2(int i, char ch1, char ch2) {
// 使用结构体成员
}
```
在这种情况下,通常需要将结构体的成员作为单独的参数传递。
6. **注意事项**:
- 结构体变量不能直接整体输入和输出,需要逐个成员进行处理。
- 结构体成员的赋值或访问需遵循成员顺序,不允许跳跃式赋值。
- 结构体数组的初始化要注意区分各个元素,通常通过花括号分组来完成。
以上内容涵盖了C语言中关于结构体的基本概念、定义、初始化、引用、赋值以及在函数调用中的传递方式,这些都是理解和编写涉及结构体的C程序的基础。在实际编程中,结构体常用于表示复杂的数据结构,如链表、树等,是实现数据结构和算法的关键工具。