数组元素连续存放。除少数 sizeof 和取整个数组地址等情况外,数组名会转换为首元素地址,因此 int *p = arr 与 int *p = &arr[0] 得到相同起点。指针运算会按元素类型的大小移动。
#include <stdio.h>
int main(void) {
int arr[] = {4, 1, 6, 7};
int *p = arr;
printf("%d\n", *p);
printf("%d\n", *(p + 2));
return 0;
}知识测验
题目
在大多数表达式中,arr 与哪个地址等价?
互动实验
让 p 沿数组移动
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
知识测验
题目
当 p 指向 arr[0] 时,*(p + 2) 读取什么?
数组参数与 sizeof
函数形参 int arr[] 和 int *arr 表示相同的指针参数。函数只收到首元素地址,不携带长度。真实数组仍在 main 中时,sizeof(arr)/sizeof(arr[0]) 可以计算元素数;进入 search 后,sizeof(arr) 只得到指针自身大小。
#include <stdio.h>
int search(const int *arr, int n, int key) {
for (int i = 0; i < n; i++) {
if (arr[i] == key) {
return i;
}
}
return -1;
}
int main(void) {
int arr[] = {4, 7, 1, 3, 9, 2};
int n = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", search(arr, n, 3)); // 3
return 0;
}知识测验
题目
为什么 search 需要单独接收 n?
动手练习
使用指针遍历求和
实现 sum_array(const int *arr, int n),从 arr 开始移动指针到 arr + n,每次累加 *p。用 {4, 1, 6, 7} 测试。
- 函数接收首元素指针和元素个数。
- 设置 end = begin + count。
- 循环中累加 *p 并移动 p,最终返回 total。
动手练习
使用两端指针反转数组
实现 reverse(int *arr, int n),让 left 指向首元素、right 指向末元素,向中间移动并原地交换。测试 {2, 4, 6, 8, 10}。
- left 指向首元素,right 指向末元素。
- 当 left < right 时交换 *left 与 *right。
- 每轮让 left++、right--,最后输出数组。