调用void函数C ++时的结果差异

时间:2014-01-28 17:18:08

标签: 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_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。有关为什么我每次都收到与上述相同的垃圾值的任何评论?

3 个答案:

答案 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);

将最后一个声明与我向你展示的第二个程序的声明进行比较。

在第二个程序中,该函数获取其参数的副本。它的参数是函数的局部变量。因此,退出该局部变量的函数将丢弃此局部变量的任何更改。

在第一个程序中,函数获取数组第一个元素的地址。它在此地址进行更改。因此原始数组的相应元素将被更改。