[英]Difference in results when calling inside void function C++
当我在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
将标量传递给void函数
#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 //一些垃圾值
PS关于为什么我每次都会收到与上面相同的垃圾值的任何评论?
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
更新它。
数组参数实际上被转换为int*
类型,因此您实际上正在做的事情是将指针传递给main
声明的数组的第一个元素。 因此,当您分配给该数组的第一个元素时,您正在修改main
的数组。
但是,当你传递一个int
时, int
被复制到函数,并修改该副本。 在main
中看不到此修改。
如果按以下方式定义函数,则在第二个程序中可以获得相同的结果
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);
将最后一个声明与我为第二个程序显示的声明进行比较。
在第二个程序中,该函数获取其参数的副本。 它的参数是函数的局部变量。 因此,在退出该函数后,该局部变量的任何更改都将被丢弃,因为该局部变量将被销毁。
在第一个程序中,函数获取数组第一个元素的地址。 它在此地址进行更改。 因此,原始数组的相应元素将被更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.