2014-04-17 26 views
0

如果我们有以下代码,当我们调用函数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 
+3

因为你会传递一个引用吗?你应该阅读一本关于C++的书。 –

+0

[C++中指针变量和引用变量之间的区别是什么?](http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-可变in-c) – user657267

+0

内存分配*无论*。它是否在'main()'中看到了白天的亮点,这是区别。任何有关C++的书籍都将涵盖参考资料。他们中的大多数甚至会相当准确地完成。 – WhozCraig

回答

4

您正在通过值传递指针,所以f有它自己的副本。指针a位于f的本地,因此调用者无法访问它(并且分配的内存被泄漏,顺便说一下)。

当您通过引用传递指针时,a在语义上与传递的指针相同。所以调用者传递的指针指向函数中分配的内存。

+0

第二种情况呢? – user2878007

+0

@ user2878007作为一个函数参数,int a []作为函数参数与int * a相同,当你通过operator []访问它时,你基本上是去引用指针,访问它指向的数据。 – juanchopanza

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()这样的函数中使用这个调用,在那里你传递null结束字符串。请参阅Bjarne Stroupstrup第92页的“The C++ Programming Language”第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=onepage&q&f=false

+0

感谢您的亲切解释:) – user2878007