- 行为差异
- 数组作为函数参数:
- 当数组作为函数参数传递时,实际上传递的是数组首元素的指针,数组会自动退化为指针。在函数内部,无法直接获取数组的原始大小信息(即数组元素的个数)。
- 指针作为函数参数:
- 指针传递的就是地址,同样在函数内部无法直接获取其所指向的内存区域中元素的个数(除非额外传递元素个数信息)。不过指针的灵活性更高,可以指向动态分配的内存等。
- 示例代码
#include <iostream>
// 函数声明,计算数组元素之和
int sumArray(int arr[], int size);
// 函数声明,计算指针所指向内存区域元素之和
int sumPointer(int* ptr, int size);
int main() {
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);
std::cout << "数组作为参数传递,和为: " << sumArray(arr, size) << std::endl;
std::cout << "指针作为参数传递,和为: " << sumPointer(arr, size) << std::endl;
return 0;
}
int sumArray(int arr[], int size) {
int sum = 0;
for (int i = 0; i < size; ++i) {
sum += arr[i];
}
return sum;
}
int sumPointer(int* ptr, int size) {
int sum = 0;
for (int i = 0; i < size; ++i) {
sum += *(ptr + i);
}
return sum;
}
- 分析操作差异
- 在
sumArray
函数中,arr
虽然声明为数组形式,但在函数内部等同于指针,对其操作与指针类似,通过arr[i]
访问元素本质上是指针偏移操作*(arr + i)
。并且由于数组退化为指针,在函数内部无法通过sizeof(arr)
获取数组实际大小,必须依靠外部传入的size
参数。
- 在
sumPointer
函数中,ptr
就是一个指针,通过*(ptr + i)
来访问其所指向内存区域的元素,同样也依赖外部传入的size
参数来确定循环次数。所以在计算和的逻辑上两者相似,但从概念上理解,数组作为参数时会隐式转换为指针,而指针参数则更直接地体现了地址传递的特性。