传"值"调用
在函数调用运行过程中,不会改变实参值。
void test(int n)
{
n = 20; // 仅仅改变n的值
}
int main()
{
int a = 10;
test(a); // 函数中的操作a不会受影响
}
两个变量都指向不同的内存地址。
传"址"调用
在函数调用运行过程中,会改变实参值。
void test(int * n) // 指针变量接收地址
{
*n = 20; // 改变了a的值
}
int main()
{
int a = 10;
test(&a); // &取地址很关键
}
n指向了a变量的内存地址,n的操作会影响a的值。
数组传参
将数组名作为参数传给函数,也是传"址"调用。
通常情况下,数组名代表的是数组首元素的地址。
数组名不是首元素地址的情况:C - 数组名不是首元素地址的的2个例外,这篇博客有简单说明。
void test(int arr[], int len)
{
int i;
for (i = 0; i < len; i++)
{
arr[i] = i + 6;
}
}
int main()
{
int arr[] = {1, 2, 3, 4, 5};
int i,
len = sizeof arr / sizeof arr[0];
// 数组长度(元素个数)
test(arr, len); // 改变了数组元素的值
for (i = 0; i < len; i++)
{ // 不再是1 2 3 4 5
printf("%d ", arr[i]); // 6 7 8 9 10
}
printf();
return 0;
}