C++ 调用内部空函数C++;

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

为什么在调用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;
}
#包括
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);