面试题答案
一键面试值传递
- 概念:在值传递中,函数接收的是调用者传递的参数值的副本。函数内部对这些参数的任何修改都只影响副本,而不会改变调用者提供的原始值。
- 内存操作:当函数被调用时,为形参分配新的内存空间,这些形参的值初始化为实参的值。
- 数据修改:函数内部对形参的修改不会影响实参。
示例代码:
#include <stdio.h>
void swapValue(int a, int b) {
int temp;
temp = a;
a = b;
b = temp;
}
int main() {
int num1 = 5, num2 = 10;
printf("Before swapValue: num1 = %d, num2 = %d\n", num1, num2);
swapValue(num1, num2);
printf("After swapValue: num1 = %d, num2 = %d\n", num1, num2);
return 0;
}
在上述代码中,swapValue
函数接收 num1
和 num2
的副本 a
和 b
,函数内交换 a
和 b
的值,但 num1
和 num2
的原始值并未改变。
指针传递
- 概念:指针传递时,函数接收的是调用者传递的变量的内存地址。通过这个地址,函数可以直接访问和修改调用者提供的原始数据。
- 内存操作:形参是指针变量,它存储的是实参的内存地址。函数通过这个地址访问实参所在的内存空间。
- 数据修改:函数内部对指针所指向的数据的修改会直接影响实参。
示例代码:
#include <stdio.h>
void swapPointer(int *a, int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main() {
int num1 = 5, num2 = 10;
printf("Before swapPointer: num1 = %d, num2 = %d\n", num1, num2);
swapPointer(&num1, &num2);
printf("After swapPointer: num1 = %d, num2 = %d\n", num1, num2);
return 0;
}
在上述代码中,swapPointer
函数接收 num1
和 num2
的地址,通过指针间接访问并修改 num1
和 num2
的值,因此 num1
和 num2
的值在函数调用后发生了交换。
总结
- 值传递适用于函数不需要修改调用者提供的原始数据的情况,其优点是简单直观,缺点是如果传递的数据量较大,会消耗较多内存。
- 指针传递适用于需要在函数内部修改调用者数据的场景,通过传递地址可以提高效率,避免数据的重复拷贝,但使用指针需要更加小心,防止空指针等错误。