1. 指针与结构体的核心概念解析
指针和结构体是C/C++语言中两个最基础也最重要的概念。它们就像建筑中的钢筋和混凝土,单独使用时已经很强大了,但结合起来才能构建出真正复杂的数据结构。
1.1 什么是指针
指针本质上就是一个存储内存地址的变量。想象你住在一个巨大的小区里,指针就是那个写着"3栋502室"的门牌号,而不是住在里面的具体人。这个特性让指针具有以下关键能力:
- 间接访问:通过地址找到实际数据
- 动态内存管理:运行时分配和释放内存
- 高效传参:避免大数据拷贝
- 构建复杂数据结构:链表、树等的基础
在32位系统中指针占4字节,64位系统中占8字节,无论它指向什么类型的数据都是如此。这就是指针的"公平性"——它只关心地址,不关心地址里住的是谁。
1.2 结构体的本质
结构体(struct)是用户自定义的复合数据类型,它把多个不同类型的数据打包成一个整体。比如描述一个学生:
c复制struct Student {
int id; // 4字节
char name[20]; // 20字节
float score; // 4字节
}; // 整个结构体占28字节(考虑内存对齐)
结构体的内存布局是连续的,但编译器可能会在成员之间插入填充字节(padding)以实现内存对齐,这会影响到结构体的实际大小。使用sizeof运算符可以获取结构体的真实大小。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 结构体指针的声明与使用
2.1 基本声明方式
声明一个指向结构体的指针有两种常见形式:
c复制// 方式1:先定义结构体类型,再声明指针
struct Point {
int x;
int y;
};
struct Point *p1;
// 方式2:定义结构体类型的同时声明指针
struct Student {
int id;
char name[20];
} *p2;
在C++中,struct关键字可以省略,但在C语言中必须保留。现代C++中更推荐使用class替代struct来定义数据结构。
2.2 访问结构体成员
通过结构体指针访问成员有两种语法,它们本质上是等价的:
c复制struct Student s;
struct Student *p = &s;
// 方式1:解引用后使用点号
(*p).id = 1001;
// 方式2:直接使用箭头运算符
p->id = 1001; // 更简洁,推荐使用
箭头运算符->实际上是解引用和成员访问的组合语法糖。在编译器看来,p->id完全等价于(*p).id,但前者更简洁且不易出错。
注意:当指针未初始化或为NULL时,尝试访问成员会导致段错误。良好的编程习惯是总是检查指针有效性:
c复制if (p != NULL) { p->id
