Menu
CoddyTech

指向结构体的指针

本课属于 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 程序至关重要。

challenge icon

挑战

简单

编写一个 C 程序,演示如何使用指向结构体的指针。程序应完成以下操作:

  1. 定义一个名为 Product 的 struct,包含以下成员:
    • 一个整数 id,用于存储产品 ID
    • 一个大小为 25 的字符数组 name,用于存储产品名称
    • 一个浮点数 price,用于存储产品价格
    • 一个整数 quantity,用于存储可用数量
  2. 在 main 函数中,创建一个名为 item 的 Product 变量,并使用以下值对其进行初始化:
    • ID:501
    • 名称:"Laptop"
    • 价格:899.99
    • 数量:15
  3. 声明一个指向 Product 结构体的指针,命名为 itemPtr
  4. 使用取地址运算符,将 item 变量的地址赋给 itemPtr
  5. 通过直接访问结构体成员(使用点运算符)打印原始产品信息,格式必须完全如下:
    • Original Product Info:
    • ID: [id]
    • Name: [name]
    • Price: [price]
    • Quantity: [quantity]
  6. 通过指针访问结构体成员(使用解引用运算符和点表示法:(*itemPtr).member),打印相同的产品信息,格式必须完全如下:
    • Product Info via Pointer:
    • ID: [id]
    • Name: [name]
    • Price: [price]
    • Quantity: [quantity]
  7. 通过按以下确切格式打印内存地址,验证指针是否正确指向该结构体:
    • 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;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: C 在线编译器