跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C 语言结构体访问
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C语言结构体访问 = == 介绍 == 在C语言中,'''结构体'''(struct)是一种用户自定义的数据类型,允许将不同类型的数据组合成一个单一的复合类型。结构体的访问是指通过成员运算符(`.`或`->`)来获取或修改结构体成员的值。理解结构体访问是掌握C语言数据结构的关键步骤。 结构体访问主要有两种方式: * '''直接访问''':使用点运算符(`.`)访问结构体变量的成员。 * '''间接访问''':通过指针使用箭头运算符(`->`)访问结构体指针指向的成员。 == 直接访问结构体成员 == 直接访问适用于结构体变量本身(非指针)。语法如下: <syntaxhighlight lang="c"> struct 结构体名 变量名; 变量名.成员名; </syntaxhighlight> === 示例 === 以下代码定义了一个`Student`结构体,并演示了直接访问其成员: <syntaxhighlight lang="c"> #include <stdio.h> #include <string.h> struct Student { char name[50]; int age; float gpa; }; int main() { struct Student student1; // 直接访问并赋值 strcpy(student1.name, "Alice"); student1.age = 20; student1.gpa = 3.7; // 直接访问并打印 printf("Name: %s\n", student1.name); printf("Age: %d\n", student1.age); printf("GPA: %.2f\n", student1.gpa); return 0; } </syntaxhighlight> '''输出:''' <pre> Name: Alice Age: 20 GPA: 3.70 </pre> == 间接访问结构体成员(指针访问) == 当使用结构体指针时,可以通过箭头运算符(`->`)访问成员。语法如下: <syntaxhighlight lang="c"> struct 结构体名 *指针名; 指针名->成员名; </syntaxhighlight> === 示例 === 以下代码演示了通过指针访问结构体成员: <syntaxhighlight lang="c"> #include <stdio.h> #include <stdlib.h> struct Point { int x; int y; }; int main() { struct Point *p = malloc(sizeof(struct Point)); // 间接访问并赋值 p->x = 10; p->y = 20; // 间接访问并打印 printf("Point coordinates: (%d, %d)\n", p->x, p->y); free(p); return 0; } </syntaxhighlight> '''输出:''' <pre> Point coordinates: (10, 20) </pre> == 结构体访问的实际应用 == 结构体访问在以下场景中非常有用: 1. '''数据库记录''':存储和访问学生、员工等数据。 2. '''图形编程''':表示2D/3D坐标(如`Point`、`Rectangle`)。 3. '''硬件寄存器映射''':通过结构体访问硬件寄存器。 === 实际案例:学生管理系统 === 以下代码模拟了一个简单的学生管理系统,使用结构体存储和访问学生信息: <syntaxhighlight lang="c"> #include <stdio.h> #include <string.h> struct Student { int id; char name[50]; float marks[3]; // 存储3门课程的成绩 }; void printStudent(struct Student *s) { printf("ID: %d\n", s->id); printf("Name: %s\n", s->name); printf("Marks: %.2f, %.2f, %.2f\n", s->marks[0], s->marks[1], s->marks[2]); } int main() { struct Student s1 = {1, "Bob", {85.5, 90.0, 78.5}}; printStudent(&s1); return 0; } </syntaxhighlight> '''输出:''' <pre> ID: 1 Name: Bob Marks: 85.50, 90.00, 78.50 </pre> == 嵌套结构体访问 == 结构体可以嵌套,即一个结构体的成员是另一个结构体。访问嵌套成员时,需要使用多个成员运算符。 === 示例 === <syntaxhighlight lang="c"> #include <stdio.h> struct Address { char city[50]; char state[50]; }; struct Employee { int id; char name[50]; struct Address addr; // 嵌套结构体 }; int main() { struct Employee emp = {101, "John", {"New York", "NY"}}; // 访问嵌套结构体成员 printf("Employee ID: %d\n", emp.id); printf("City: %s\n", emp.addr.city); // 嵌套访问 printf("State: %s\n", emp.addr.state); return 0; } </syntaxhighlight> '''输出:''' <pre> Employee ID: 101 City: New York State: NY </pre> == 结构体访问的底层原理 == 结构体成员的访问在内存中是按偏移量计算的。假设结构体`S`的成员`m`的偏移量为<math>\text{offset}(S, m)</math>,则访问`var.m`等价于: <math> \text{\&var} + \text{offset}(S, m) </math> <mermaid> graph LR A[结构体变量] --> B[成员1] A --> C[成员2] A --> D[成员3] </mermaid> == 常见问题与注意事项 == 1. '''未初始化指针''':访问未初始化的结构体指针会导致段错误。 2. '''内存对齐''':结构体成员可能存在内存对齐问题,影响访问效率。 3. '''运算符混淆''':`.`用于变量,`->`用于指针,不可混用。 == 总结 == 结构体访问是C语言中操作复合数据的基础。掌握直接访问(`.`)和间接访问(`->`)是编写高效、可读性强的代码的关键。通过实际案例和嵌套结构体的学习,可以更好地理解其应用场景。 [[Category:编程语言]] [[Category:C]] [[Category:C 语言结构体与联合]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)