C语言 结构体 结构体详解 结构体
时间: 2025-05-23 22:23:39 浏览: 30
### C语言中的结构体详细用法
#### 什么是结构体?
结构体是一种用户自定义的数据类型,能够将不同类型的数据组合在一起形成一个新的复合数据类型。这种特性使得程序员可以更方便地组织和管理复杂的数据。
#### 定义结构体
结构体可以通过`struct`关键字定义。以下是基本语法:
```c
struct 结构体名称 {
数据类型 成员1;
数据类型 成员2;
...
};
```
例如:
```c
struct Point {
int x;
int y;
};
```
这里定义了一个名为 `Point` 的结构体,包含两个整型成员变量 `x` 和 `y`[^1]。
#### 初始化结构体
结构体可以在声明时直接初始化,也可以在之后逐一赋值。以下是一个例子:
```c
// 声明并初始化结构体
struct Book {
char title[50];
char author[50];
char grade;
int pages;
float price;
};
// 方法一:直接初始化
struct Book myBook = {"C Programming", "Nikita", 'A', 300, 500.00}[^3];
// 方法二:逐个赋值
struct Book anotherBook;
strcpy(anotherBook.title, "Advanced C");
strcpy(anotherBook.author, "John Doe");
anotherBook.grade = 'B';
anotherBook.pages = 400;
anotherBook.price = 600.00;
```
#### 访问结构体成员
通过`.`运算符访问结构体的成员。例如:
```c
printf("Title: %s\n", myBook.title);
myBook.pages += 50; // 修改页数
```
如果使用的是结构体指针,则需要用箭头运算符 (`->`) 来访问其成员。例如:
```c
struct Student {
char name[50];
int age;
};
int main() {
struct Student *ptr;
ptr = (struct Student *)malloc(sizeof(struct Student));
strcpy(ptr->name, "张三");
ptr->age = 20;
printf("Name: %s, Age: %d\n", ptr->name, ptr->age);
free(ptr);
return 0;
}
```
此代码展示了如何利用动态内存分配创建结构体实例,并通过指针访问其成员[^2]。
#### 使用typedef简化结构体声明
为了减少重复输入`struct`关键字,通常会结合`typedef`一起使用。例如:
```c
typedef struct {
int id;
double score;
} Record;
Record r1 = {1, 95.5};
```
这样可以直接使用`Record`代替完整的`struct`定义[^5]。
#### 动态内存分配与释放
对于较大的结构体或者不确定大小的情况下,推荐采用动态内存分配技术。这不仅节省空间还能提升性能。下面展示了一种常见做法:
```c
#include <stdlib.h>
#include <string.h>
struct Employee {
char name[100];
double salary;
};
void createEmployee(struct Employee **empPtr) {
(*empPtr) = (struct Employee *)malloc(sizeof(struct Employee));
if ((*empPtr)) {
strcpy((*empPtr)->name, "Alice");
(*empPtr)->salary = 75000.0;
}
}
int main() {
struct Employee *employee = NULL;
createEmployee(&employee);
if (employee != NULL) {
printf("Employee Name: %s\nSalary: %.2f\n", employee->name, employee->salary);
free(employee); // 不再需要时记得释放资源
}
return 0;
}
```
该片段说明了如何安全有效地申请及清理堆上的存储区域[^4]。
#### 函数间传递结构体
既可以按值传入也能借助地址形式传送整个结构体给其他函数处理。前者适用于小型实体;后者则更适合较大规模的对象因为只复制引用而非实际内容本身从而节约开销。
---
###
阅读全文
相关推荐






