不同的传递参数,不同的输出
Different passing parameters, different output
如果我们有以下代码,当我们调用函数f
时,变量b
的内存不会被占用。但是,如果函数f
将具有原型void f(int* &a)
,则将分配存储器。这怎么可能?
#include <iostream>
using namespace std;
void f(int* a)
{
a = new int[10];
a[0] = 55;
}
int main()
{
int *b;
f(b);
return 0;
}
编辑:好吧,我明白了主要的想法,但为什么还有可能呢?
void f(int a[])
{
a[0] = 5;
}
int b[] = {1,2,3,4,5};
f(b);
//The value of b[0] will be 5 after the end of function call
您按值传递指针,因此f
有自己的指针副本。指针a
是f
的本地指针,因此调用方无法访问它(并且分配的内存泄漏,BTW)。
通过引用传递指针时,a
在语义上与传递的指针相同。因此,调用者传递的指针指向函数中分配的内存。
指针int * b;
实际上是变量。一种变量,它保存一个整数的内存地址。例如:
int n;
int* b = &n; // pointer b is pointing to n
由于指针是一个变量,您可以通过值或引用传递它。在这里,您可以按值将其传递给函数。同时检查http://en.cppreference.com/w/cpp/language/pointer.
在void f(int* &a)
的情况下,通过引用传递int* a
变量。它是一个变量(保存int类型变量的内存地址),它还没有在代码中初始化为任何值(在main()中)。
在您的第二个代码中。在函数void f(int a[])
中,当用f(b);
传递int b[] = {1,2,3,4,5};
时,可以将数组名称"隐式"转换为指针。问题是函数f()不知道数组的大小。例如,在strlen()等函数中使用此调用,在这些函数中传递null终止字符串。查看Bjarne Stroupstrup第92页的《C++编程语言》第3版。
还有一个基本规则:a[i] <=> (*(a+i))
。所以你的函数void f(int a[])
等于void f(int* a)
的定义。查看Gail Anderson的"导航C++和面向对象设计",第40页:http://books.google.gr/books?id=b-NiT6w8FTAC&pg=PA40#v=一页&q&f=错误
- C++输出参数与返回值
- C++函子作为函数的输出参数
- 将ctypes c_void_p强制转换为c输出参数
- 用输出参数包装一个c++函数,以便在javascript/node中使用
- 我可以将函数的输出参数存储到unique_ptr中吗?
- 在存在错误代码的情况下输出参数与 NRVO
- 具有输出参数的QT InvoKeMethod调用函数
- 将具有std ::向量的C 函数称为Julia的输入和输出参数
- jni jiniArray 作为输出参数不会更改参数的值
- 返回容器时删除输出参数
- 通过 API 填写"std::optional"<T>,获取输出"T*"参数
- 指针或局部变量,用于函数的输出参数
- 如何在输出参数中使用基类
- 值语义与具有大数据结构的输出参数
- 当输出参数是类时,如何在C++中调用COM方法
- 如何在不破坏现有代码的情况下将输出参数添加到功能
- stl数据结构的堆栈上输出参数与返回值的效率
- C# P/调用:本机输出参数值不会到达托管代码
- 在 C++11 中将结构作为输出参数传递
- 将字符串从 C# 方法返回到输出参数中的C++函数