如果我们有以下代码,当我们调用函数b
时,不会采用变量f
的内存。但是如果函数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
答案 0 :(得分:4)
您正在按值传递指针,因此f
有自己的副本。指针a
是f
的本地,因此调用者无法访问它(并且分配的内存泄露,BTW)。
当您通过引用传递指针时,a
在语义上与传递的指针相同。因此调用者传递的指针指向函数中分配的内存。
答案 1 :(得分:1)
指针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[])
传递int b[] = {1,2,3,4,5};
时,在函数f(b);
中,您可以将数组名称“隐式”转换为指针。问题是函数f()不知道数组的大小。例如,您在strlen()等函数中使用此调用,其中传递空终止字符串。查阅“C ++编程语言”,第3版,作者:Bjarne Stroupstrup,第92页。
还有一条基本规则: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=onepage&q&f=false