呼叫void函数C 时的结果差异

Difference in results when calling inside void function C++

本文关键字:结果 void 函数 呼叫      更新时间:2023-10-16

当我在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//一些垃圾值

P.S。关于为什么我会收到与上述每次相同的垃圾值的任何评论?

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

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

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

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