Menu
CoddyTech

数组名作为指针

本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 7 课,共 63 课。

在 C 中,数组和指针之间有一种特殊关系,这对理解 C 如何处理内存中的数据至关重要。声明数组时,数组名本身就相当于指向数组第一个元素的常量指针。

这意味着,当你有一个像 int numbers[5]; 这样的数组时,名称 numbers 本质上是一个始终指向 numbers[0] 的指针。你可以把数组名看作一个内置指针,无需单独声明。

int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers' 指向第一个元素
// numbers == &numbers[0]  // 它们是等价的!

这种等价关系非常重要:numbers 和 &numbers[0] 给出的内存地址完全相同。数组名只是引用第一个元素地址的一种更方便的方式,不必使用取地址运算符。

理解这种关系,就能开始在数组中使用指针技巧,让代码更加灵活高效。关键区别在于,数组名是常量指针,而普通指针不是,你不能更改它指向的内容。

challenge icon

挑战

简单

编写一个 C 程序,演示数组名与指向数组首元素的指针等价。你的程序应当:

  1. 声明一个名为 numbers、包含 4 个元素的整数数组,并用值 {10, 20, 30, 40} 初始化
  2. 声明一个名为 ptr、指向整数的指针
  3. 将数组名 numbers 赋给指针 ptr
  4. 使用 printf 和 %p 格式说明符,打印 numbers 中存储的地址
  5. 使用 printf 和 %p 格式说明符,打印首个元素 &numbers[0] 的地址
  6. 使用 printf 和 %p 格式说明符,打印 ptr 中存储的地址
  7. 使用数组名打印首个元素的值:*numbers
  8. 使用指针打印首个元素的值:*ptr

你的输出应按以下格式显示结果:

Array name address: [address]
First element address: [address]
Pointer address: [address]
Value via array name: 10
Value via pointer: 10

这个挑战演示了数组名相当于一个指向首个元素的常量指针;当 ptr 被赋值为数组名时,numbers、&numbers[0] 和 ptr 都包含相同的内存地址。

亲手试试

#include <stdio.h>

int main() {
    // TODO:在这里编写你的代码
    // 1. 声明数组 'numbers',并用 {10, 20, 30, 40} 初始化
    // 2. 声明一个名为 'ptr' 的整数指针
    // 3. 将数组名赋值给指针
    // 4. 打印所有要求的地址和值
    
    return 0;
}
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: C 在线编译器