- 本质区别:
- 数组:
- 当数组作为函数参数传递时,实际上传递的是数组首元素的指针,数组的大小信息丢失。在函数内部,无法通过常规方式获取传递进来数组的真实大小。例如:
void printArraySize(int arr[]) {
// 以下计算是错误的,arr在这里是指针,不是数组,sizeof(arr)得到的是指针的大小
// 假设在64位系统下,指针大小一般为8字节
std::cout << "Size of arr in function: " << sizeof(arr) << std::endl;
}
int main() {
int myArray[] = {1, 2, 3, 4, 5};
printArraySize(myArray);
// 在main函数中,数组大小可以正确获取,这里是5 * sizeof(int)
std::cout << "Size of myArray in main: " << sizeof(myArray) << std::endl;
return 0;
}
- 指针:
- 指针作为函数参数传递,和数组作为参数传递类似,都是传递地址。但指针更强调地址的概念,它可以指向单个元素,也可以指向动态分配的内存区域等。例如:
void printPointer(int* ptr) {
// ptr是指针,同样无法通过sizeof(ptr)获取其所指对象数量
std::cout << "Size of ptr in function: " << sizeof(ptr) << std::endl;
}
int main() {
int num = 10;
int* ptr = #
printPointer(ptr);
return 0;
}
- 场景选择:
- 数组参数:
- 场景:当函数逻辑主要是处理一个有逻辑关系的元素集合,并且期望调用者提供一个固定大小的数组时,可以使用数组参数。例如,对一个固定长度的向量进行操作的函数。
- 示例:
void vectorAddition(int a[3], int b[3], int result[3]) {
for (int i = 0; i < 3; i++) {
result[i] = a[i] + b[i];
}
}
int main() {
int vectorA[3] = {1, 2, 3};
int vectorB[3] = {4, 5, 6};
int result[3];
vectorAddition(vectorA, vectorB, result);
for (int i = 0; i < 3; i++) {
std::cout << result[i] << " ";
}
return 0;
}
- 指针参数:
- 场景:当需要处理动态分配的内存或者不确定大小的数据集,或者需要对单个元素进行间接访问操作时,使用指针参数。例如,在处理链表节点时,需要传递节点指针。
- 示例:
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
void insertNode(ListNode*& head, int newVal) {
ListNode* newNode = new ListNode(newVal);
if (head == NULL) {
head = newNode;
} else {
ListNode* current = head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
int main() {
ListNode* head = NULL;
insertNode(head, 1);
insertNode(head, 2);
return 0;
}