繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM