面试题答案
一键面试#include <stdio.h>
void doubleArray(int *arr, int size) {
for (int i = 0; i < size; i++) {
*(arr + i) *= 2;
}
}
使用指针而不是直接传递数组名的原因
在C语言中,当函数参数为数组时,实际上传递的是数组首元素的指针。所以,直接传递数组名本质上也是传递指针。使用指针操作数组元素更清晰地体现了这一底层机制,并且指针操作更灵活,可以进行算术运算来访问数组不同位置的元素。
指针传递在这种场景下的优势
- 高效:避免了数组的整体拷贝,只传递了一个指针(通常为4字节或8字节,取决于系统架构),如果数组很大,能极大减少内存开销和传递时间。
- 灵活性:指针可以进行算术运算,如
arr + i
来访问数组的不同元素,操作更加直接和灵活。
指针传递可能存在的风险
- 空指针风险:如果传入的指针是
NULL
,对其进行解引用操作(如*arr
)会导致程序崩溃,出现段错误。 - 越界访问风险:指针操作数组时,如果没有正确检查边界,如
*(arr + size)
(size
超过数组实际大小),会访问到未分配的内存,导致未定义行为。 - 内存管理问题:如果在函数外部动态分配了数组内存,并传递指针到函数中,如果函数对指针进行了修改(如
arr = arr + 1
),可能导致函数外部对该内存的访问混乱,并且可能造成内存泄漏(如果没有正确释放内存)。