呼叫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//一些垃圾值
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);
将最后一份声明与我向第二个程序展示的声明进行比较。
在第二个程序中,函数获取其参数的副本。它的参数是函数的局部变量。因此,在退出局部变量的函数后,将丢弃此局部变量的任何更改。
在第一个程序中,函数获取数组的第一个元素的地址。它在此地址进行更改。因此,原始数组的相应元素将被更改。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 在c++类上调用void函数
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?
- 如何在C 中为文本文件编写代码结果(在void函数之内)
- 呼叫void函数C 时的结果差异
- C void*任何类型实现都会返回奇怪的结果
- static_casting constexpr void* 的结果是常量表达式吗?
- 取消引用运算符给出的结果与具有 void* 的数组偏移运算符不同
- 缓存函数的结果可能包括void
- 从返回类型的函数中获取结果'void'而结果变量是输入参数之一 - C++
- std::is_constructible<void()>::value 的正确结果是什么?
- 如何使void*参数在函数中保存其局部结果,该函数使用struct *调用
- BGL adjacency_list<listS, listS>::vertex_descriptor 计算结果为 void*
- void() 问题 - 它不打印结果
- 计算结果为"void..."的非类型参数包不是非法的吗?