"C语言中的结构体和指针是编程中重要的数据结构,它们允许我们组织和操作复杂的数据。结构体可以包含多个不同类型的成员,如整型、字符型、浮点型等,而指针则能指向这些结构体变量,从而实现对结构体成员的间接访问。"
在C语言中,结构体是复合数据类型,它允许我们将不同类型的数据组合到一起形成一个新的数据类型。定义结构体的基本语法是:
```c
struct 结构体名 {
类型标识符 成员名;
类型标识符 成员名;
...
};
```
例如,定义一个`student`结构体,包含学号(`num`)、姓名(`name`)、性别(`sex`)和分数(`score`):
```c
struct student {
long int num;
char name[20];
char sex;
float score;
};
```
接着,我们可以创建结构体变量并初始化它们,例如:
```c
struct student stu_1;
stu_1.num = 89101;
strcpy(stu_1.name, "Li Lin");
stu_1.sex = 'M';
stu_1.score = 89.5;
```
也可以定义一个指向结构体的指针,如`p`,并用它来引用结构体成员:
```c
struct student *p;
p = &stu_1;
p->sex = 'M'; // 通过指针访问结构体成员
p->score = 89.5;
```
这里,`p->sex`和`(*p).sex`是等价的,都表示通过指针`p`访问`struct student`的`sex`成员。`*`操作符具有较高的优先级,从左向右结合,所以`(*p)`先执行解引用操作,然后访问`sex`。
结构体变量之间可以互相赋值,但需要注意,这种赋值实际上是进行一次深拷贝,即逐个复制每个成员的值。如果结构体包含嵌套结构体,那么需要递归地引用和赋值。
结构体类型还可以作为函数的参数,这样可以在函数内部修改结构体的成员。比如:
```c
void update_student(struct student *s) {
s->score += 1.0;
}
update_student(&stu_1); // 更新stu_1的分数
```
共用体是另一种复合数据类型,与结构体类似,但它的一个成员在任何时刻只能存储一种类型的数据。枚举类型(enum)则用于定义一组符号常量,可以看作是整型的别名。
`typedef`语句可以用来为已存在的类型创建新的别名,这在处理复杂的结构体类型时尤其有用,可以使代码更易读。例如:
```c
typedef struct student {
int num;
char name[20];
char sex;
float score;
} Student;
```
之后,我们就可以使用`Student`这个新类型来定义变量,而无需每次都写`struct`关键字。
理解和熟练运用C语言中的结构体和指针,对于编写复杂的程序至关重要,它们提供了一种有效管理和操作数据的方式。通过结构体,我们可以创建自定义的数据模型,而指针则使得我们可以灵活地访问和修改这些数据。