C++ 调用内部空函数C++;
为什么在调用void函数中的数组和在调用void函数中的标量时,结果会有所不同: 将数组传递到void函数:C++ 调用内部空函数C++;,c++,arrays,function,void,C++,Arrays,Function,Void,为什么在调用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_ce
#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;
}
#包括
const int n_cells=1;
使用名称空间std;
无效函数1(int c[n_单元格]、int a、int b)
{
c[0]=a+b;
}
int main(){
INTA=3;
int b=4;
int c[n_单元格];
职能1(c、a、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);
将上一个声明与我为第二个程序显示的声明进行比较
在第二个程序中,函数获取其参数的副本。其参数是函数的局部变量。因此,退出函数后,该局部变量的任何更改都将被丢弃,而该局部变量将被销毁
在第一个程序中,函数获取数组的第一个元素的地址。它在此地址进行更改。因此,原始数组的相应元素将被更改。编译时打开警告。如果使用GCC,请从-Wmost
开始。一个好的编译器会警告您c
未初始化在第二个节目中。
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);