数组名作为指针
本课属于 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] 给出的内存地址完全相同。数组名只是引用第一个元素地址的一种更方便的方式,不必使用取地址运算符。
理解这种关系,就能开始在数组中使用指针技巧,让代码更加灵活高效。关键区别在于,数组名是常量指针,而普通指针不是,你不能更改它指向的内容。
挑战
简单编写一个 C 程序,演示数组名与指向数组首元素的指针等价。你的程序应当:
- 声明一个名为
numbers、包含 4 个元素的整数数组,并用值 {10, 20, 30, 40} 初始化 - 声明一个名为
ptr、指向整数的指针 - 将数组名
numbers赋给指针ptr - 使用
printf和%p格式说明符,打印numbers中存储的地址 - 使用
printf和%p格式说明符,打印首个元素&numbers[0]的地址 - 使用
printf和%p格式说明符,打印ptr中存储的地址 - 使用数组名打印首个元素的值:
*numbers - 使用指针打印首个元素的值:
*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;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: C 在线编译器