#include <stdio.h>
void modifyArray(int *ptr, int size) {
// 使用指针方式修改数组元素
for (int i = 0; i < size; i++) {
*(ptr + i) = 2 * (*(ptr + i));
}
// 使用下标方式修改数组元素
for (int i = 0; i < size; i++) {
ptr[i] = 2 * ptr[i];
}
}
int main() {
int arr[4] = {3, 5, 7, 9};
modifyArray(arr, 4);
for (int i = 0; i < 4; i++) {
printf("%d ", arr[i]);
}
return 0;
}
一维数组指针与下标的转换关系
- 在C语言中,当把一维数组作为函数参数传递时,数组名会自动退化为指向数组首元素的指针。例如
void modifyArray(int *ptr, int size)
函数中,ptr
实际上指向数组 arr
的首元素。
- 指针和下标在访问数组元素时本质上是等价的。
*(ptr + i)
和 ptr[i]
都表示访问数组 ptr
的第 i
个元素。这是因为在编译器处理时,ptr[i]
会被解释为 *(ptr + i)
。
需要注意的要点
- 数组越界:无论是使用指针还是下标访问数组元素,都要确保访问的下标在有效范围内。例如上述代码中,
size
为4,有效下标范围是0到3,如果访问 ptr[4]
或 *(ptr + 4)
就会导致未定义行为。
- 函数声明:函数参数声明为数组形式(如
void modifyArray(int arr[], int size)
)和指针形式(如 void modifyArray(int *ptr, int size)
)是等价的,都表示传递的是指向数组首元素的指针。
- 指针运算:使用指针方式访问数组元素时,指针运算要小心,确保每次运算的结果仍然指向有效的内存区域。例如
ptr++
会改变 ptr
的指向,如果不注意,可能导致后续访问数组元素错误。