为什么在void函数中调用数组时以及在void函数中调用标量时结果会有差异:
将数组传递给void函数:
#include <iostream>
const int n_cells = 1;
using namespace std;
void function1(int c[n_cells], int a, int b)
{
c[0] = a + b;
}
int main(){
int a = 3;
int b = 4;
int c[n_cells];
function1(c, a, b);
cout<<"c = "<<c[0];
return 1;
}
结果:
c = 7
将标量传递给空函数
#include <iostream>
using namespace std;
void function1(int c, int a, int b)
{
c = a + b;
}
int main(){
int a = 3;
int b = 4;
int c;
function1(c, a, b);
cout<<"c = "<<c;
return 1;
}
结果:
c = 2130567168 //一些垃圾值
P.S。有关为什么我每次都收到与上述相同的垃圾值的任何评论?
答案 0 :(得分:3)
void function1(int c[n_cells], int a, int b)
有效地将指针传递给调用者的数组。 function1
然后对调用者的数组进行操作,这意味着调用者可以使用任何更新。
void function1(int c, int a, int b)
传递c
的副本。它无权访问调用者的变量,因此无法更新它。 main
从未分配c
,因此您打印出未初始化的值。
如果要更新整数参数,可以通过引用传递它
void function1(int& c, int a, int b)
// ^
现在传递一个指向调用者变量的指针,而不是传递调用者c
的副本,允许function1
更新它。
答案 1 :(得分:1)
数组参数实际上转换为类型int*
,所以你实际做的是将指针传递给main
中声明的数组的第一个元素。因此,当您分配给此数组的第一个元素时,您将在main
中修改数组。
但是,当您传递int
时,int
将被复制到该函数中并修改该副本。 main
中不会看到此修改。
答案 2 :(得分:1)
如果您按照以下方式定义函数,则可以在第二个程序中获得相同的结果
void function1(int *c, int a, int b)
{
c[0] = a + b;
}
当您按值传递数组时,编译器会隐式转换为指向其第一个元素的指针。所以这些函数声明是等效的并且声明了相同的函数
void function1(int c[n_cells], int a, int b);
void function1(int c[10], int a, int b);
void function1(int c[], int a, int b);
void function1(int *c, int a, int b);
将最后一个声明与我向你展示的第二个程序的声明进行比较。
在第二个程序中,该函数获取其参数的副本。它的参数是函数的局部变量。因此,退出该局部变量的函数将丢弃此局部变量的任何更改。
在第一个程序中,函数获取数组第一个元素的地址。它在此地址进行更改。因此原始数组的相应元素将被更改。