7.2 指针与数组
数组名本质上是一个指针,它指向数组的首元素。因此 arr 和 &arr[0] 是同一个地址,取数组地址时甚至可以不写 &。
c
int arr[] = {4, 1, 6, 7};
int *p = arr; // 等价于 &arr[0]
printf("%d\n", *p); // 4
printf("%d\n", *(p + 2)); // 6指针算术
对指向数组的指针做加减时(如 p++、p -= 2),并不是把地址加减 1 个字节,而是按指针类型的大小移动。例如 p 是 int *,int 占 4 个字节,那么 p + 1 会让地址增加 4。
所以 *(p + i) 就等于 arr[i],写成 p[i] 也成立。可以用指针遍历整个数组:
c
for (int *it = arr; it < arr + 4; it++) {
printf("%d ", *it);
}正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
数组与函数
把数组传给函数时,传过去的其实是首元素的地址,函数收到的是一个指针。因此在函数内部用 sizeof 得到的是指针的大小,而不是数组长度。所以传数组时通常要把长度一起作为参数传进去。
c
int search(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;
}sizeof(arr) / sizeof(arr[0]) 只能在数组“本体”所在的地方算出长度,一旦数组退化成指针就失效了。
正在加载本节练习...