2014-04-17 63 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