定义和使用结构体变量
- 介绍
- 基础用法
- 1.定义结构体
- 2. 声明结构体变量
- 3. 初始化和访问结构体成员
- 4. 使用指针访问结构体成员
- 5. 使用结构体数组
- 高级用法
- 6. 嵌套结构体
- 7. 匿名结构体
- 8. 结构体和动态内存分配
- 9. 结构体作为函数参数
- 按值传递
- 按引用传递
介绍
在C语言中,结构体(struct
)是一种用户定义的数据类型,它允许我们将不同类型的数据组合在一起。结构体对于处理相关联的数据非常有用,比如将一个人的姓名、年龄和地址组合在一起。
基础用法
1.定义结构体
定义结构体的语法如下:
struct 结构体名 {
数据类型 成员名1;
数据类型 成员名2;
...
数据类型 成员名N;
};
例如,我们可以定义一个表示人的结构体:
#include <stdio.h>
// 定义结构体
struct Person {
char name[50];
int age;
char address[100];
};
2. 声明结构体变量
在定义了结构体之后,我们可以声明结构体变量:
// 声明结构体变量
struct Person person1;
我们也可以在定义结构体时同时声明结构体变量:
struct Person {
char name[50];
int age;
char address[100];
} person1, person2;
3. 初始化和访问结构体成员
我们可以使用点运算符(.
)来访问和赋值结构体的成员:
#include <stdio.h>
struct Person {
char name[50];
int age;
char address[100];
};
int main() {
// 声明并初始化结构体变量
struct Person person1 = {"Alice", 30, "123 Main St"};
// 访问结构体成员
printf("Name: %s\n", person1.name);
printf("Age: %d\n", person1.age);
printf("Address: %s\n", person1.address);
// 修改结构体成员
person1.age = 31;
printf("Updated Age: %d\n", person1.age);
return 0;
}
输出结果:
4. 使用指针访问结构体成员
我们还可以通过指针访问结构体成员,使用箭头运算符(->
):
#include <stdio.h>
struct Person {
char name[50];
int age;
char address[100];
};
int main() {
struct Person person1 = {"Bob", 25, "456 Elm St"};
struct Person *ptr_person = &person1;
// 使用指针访问结构体成员
printf("Name: %s\n", ptr_person->name);
printf("Age: %d\n", ptr_person->age);
printf("Address: %s\n", ptr_person->address);
// 通过指针修改结构体成员
ptr_person->age = 26;
printf("Updated Age: %d\n", ptr_person->age);
return 0;
}
输出结果:
5. 使用结构体数组
有时候我们需要处理多个相同类型的结构体变量,这时可以使用结构体数组:
#include <stdio.h>
struct Person {
char name[50];
int age;
char address[100];
};
int main() {
// 定义结构体数组
struct Person people[2] = {
{"Charlie", 22, "789 Maple St"},
{"Dana", 28, "101 Oak St"}
};
for (int i = 0; i < 2; i++) {
printf("Person %d:\n", i + 1);
printf(" Name: %s\n", people[i].name);
printf(" Age: %d\n", people[i].age);
printf(" Address: %s\n", people[i].address);
}
return 0;
}
输出结果:
高级用法
6. 嵌套结构体
结构体可以包含其他结构体作为它的成员,这称为嵌套结构体。嵌套结构体可以帮助我们创建更加复杂的数据结构。
#include <stdio.h>
struct Address {
char street[100];
char city[50];
char state[20];
int zip;
};
struct Person {
char name[50];
int age;
struct Address address; // 嵌套结构体
};
int main() {
struct Person person1 = {"Emily", 35, {"123 Oak St", "Springfield", "IL", 62704}};
printf("Name: %s\n", person1.name);
printf("Age: %d\n", person1.age);
printf("Address: %s, %s, %s, %d\n",
person1.address.street,
person1.address.city,
person1.address.state,
person1.address.zip);
return 0;
}
输出结果:
7. 匿名结构体
在某些情况下,我们可以使用匿名结构体来简化代码。匿名结构体没有名字,可以直接使用。
#include <stdio.h>
struct Person {
char name[50];
int age;
struct {
char street[100];
char city[50];
char state[20];
int zip;
} address; // 匿名结构体
};
int main() {
struct Person person1 = {"Frank", 40, {"456 Pine St", "Riverdale", "NY", 10567}};
printf("Name: %s\n", person1.name);
printf("Age: %d\n", person1.age);
printf("Address: %s, %s, %s, %d\n",
person1.address.street,
person1.address.city,
person1.address.state,
person1.address.zip);
return 0;
}
输出结果:
8. 结构体和动态内存分配
在处理大型数据集或需要动态创建结构体时,可以使用动态内存分配(如malloc
和free
)。
#include <stdio.h>
#include <stdlib.h> // 包含 malloc 和 free
#include <string.h>
struct Person {
char name[50];
int age;
char address[100];
};
int main() {
// 动态分配内存给结构体
struct Person *person1 = (struct Person *)malloc(sizeof(struct Person));
if (person1 == NULL) {
printf("Memory allocation failed\n");
return 1;
}
// 初始化结构体成员
strcpy(person1->name, "George");
person1->age = 45;
strcpy(person1->address, "789 Birch St");
// 访问结构体成员
printf("Name: %s\n", person1->name);
printf("Age: %d\n", person1->age);
printf("Address: %s\n", person1->address);
// 释放分配的内存
free(person1);
return 0;
}
输出结果:
9. 结构体作为函数参数
结构体可以作为函数的参数传递。传递结构体有两种方式:按值传递和按引用传递。
按值传递
按值传递会复制整个结构体,因此函数内部的修改不会影响原始结构体。
#include <stdio.h>
struct Person {
char name[50];
int age;
};
void printPerson(struct Person p) {
printf("Name: %s\n", p.name);
printf("Age: %d\n", p.age);
}
int main() {
struct Person person1 = {"Helen", 50};
printPerson(person1);
return 0;
}
输出结果:
按引用传递
按引用传递通过传递指针,可以修改原始结构体。
#include <stdio.h>
struct Person {
char name[50];
int age;
};
void updateAge(struct Person *p, int newAge) {
p->age = newAge;
}
int main() {
struct Person person1 = {"Ivy", 55};
printf("Before update: Age = %d\n", person1.age);
updateAge(&person1, 60);
printf("After update: Age = %d\n", person1.age);
return 0;
}
输出结果: