指向结构体的指针
本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 44 课,共 63 课。
现在你已经熟悉了结构体的使用,是时候把它们与 C 的另一个强大概念结合起来:指针。就像你可以为 int 或 char 这样的基本数据类型创建指针一样,你也可以创建指针来存储结构体变量的地址。
声明指向结构体的指针时,语法与其他指针声明遵循相同的模式:
struct StructureName *pointerName;例如,使用我们熟悉的 Point 结构体:
struct Point p1 = {10, 20};
struct Point *ptr;这会创建一个名为 ptr 的指针,它可以存储 Point 结构体的地址。要让指针实际指向结构体变量,你可以使用取地址运算符:
ptr = &p1;要通过指针读取成员,先对它解引用,然后使用点运算符。这里必须加括号,因为 . 的绑定优先级高于 *:
printf("%d", (*ptr).x); // 等同于 p1.x现在,ptr 保存着 p1 结构体变量的内存地址。这为处理结构体开辟了新的可能性,尤其是在将它们传递给函数或动态管理内存时。结构体指针对于构建更复杂的数据结构和编写高效的 C 程序至关重要。
挑战
简单编写一个 C 程序,演示如何使用指向结构体的指针。程序应完成以下操作:
- 定义一个名为
Product的struct,包含以下成员:- 一个整数
id,用于存储产品 ID - 一个大小为 25 的字符数组
name,用于存储产品名称 - 一个浮点数
price,用于存储产品价格 - 一个整数
quantity,用于存储可用数量
- 一个整数
- 在 main 函数中,创建一个名为
item的Product变量,并使用以下值对其进行初始化:- ID:501
- 名称:"Laptop"
- 价格:899.99
- 数量:15
- 声明一个指向
Product结构体的指针,命名为itemPtr - 使用取地址运算符,将
item变量的地址赋给itemPtr - 通过直接访问结构体成员(使用点运算符)打印原始产品信息,格式必须完全如下:
Original Product Info:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- 通过指针访问结构体成员(使用解引用运算符和点表示法:
(*itemPtr).member),打印相同的产品信息,格式必须完全如下:Product Info via Pointer:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- 通过按以下确切格式打印内存地址,验证指针是否正确指向该结构体:
Address of item: [address]Value of itemPtr: [address]Address verification: [result]
验证地址时,如果两个地址相同,就打印 Match;如果不同,就打印 No Match。
这个挑战将检验你对结构体指针声明、使用取地址运算符赋值地址,以及使用解引用运算符和点表示法通过指针访问结构体成员的理解。你还将验证该指针是否正确保存了结构体变量的地址。
亲手试试
#include <stdio.h>
#include <string.h>
// TODO: 在这里定义 Product 结构体
int main() {
// TODO: 在这里编写代码
// 1. 创建并初始化 Product 变量 'item'
// 2. 声明一个名为 'itemPtr' 的 Product 指针
// 3. 将 'item' 的地址赋给 'itemPtr'
// 4. 使用点运算符打印原始产品信息
// 5. 使用 (*itemPtr).member 通过指针打印产品信息
// 6. 打印并验证地址
return 0;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: C 在线编译器