2016-05-24 28 views
-2

我有一個代碼:如何將int指針傳遞給int時?

void fun1(int ** i) { 
*i = new int(0); 
} 
void fun2(int *& i) { 
    i = new int(69); 
} 
int main() 
{ 
    using namespace std; 
    int a = new int(42); 
    fun1(&a); 
    cout << "fun1" << a << endl; 

    fun2(&a); 
    cout << "fun2" << a << endl; 
} 

而且我想通過 「a」 的功能FUN1和FUN2。我可以做到這一點,而不創建一個指向一個指針?我可以通過「a」嗎?

+0

沒有,據我所知,你必須在這些情況下創建一個單獨的指針。 –

+3

您的意思是:'int * a = new int(42);'? –

+0

你似乎有幾個拼寫錯誤,但[這適用於我](http://ideone.com/Kjq5Vd)。 –

回答

2

上述功能之一需要一個指針的指針:

void fun1(int ** i) 

另一個需要一個參照本發明的指針:

void fun1(int *& i) 

調用,而不必在一個指針變量是毫無意義,因爲這些函數的主要作用(很可能是)改變地址,傳入的指針(通過引用傳遞,作爲指針或引用)指向,以便調用者可以使用它。

讓我們假設下面將工作

int a; 
fun1(&(&a)); 

的功能將改變ADRESS「臨時」(&a這是int的指針)指向,但你也沒辦法訪問它。

+0

您不能將'&a'傳遞給'fun1',因爲'&a'不是指向指針的指針,而是指向int的指針。該行不會編譯。你可以得到最接近的是聲明一個指針,然後調用該函數:'int * p =&a; fun1(&p);',它仍然如你所說,毫無意義,因爲'int a;'變量不再被指向 –

+0

@DavidRector ups你是對的,我會編輯它 – user463035818

+0

你不能寫&(&a )因爲&a是右值。 – Lassie

0

爲了有沒有指針的引用,只是做foo(int &a) {a = 43}並調用這樣的功能:foo(a)

1

所有int a = new int(42); 1日是錯誤的操作new在堆上創建的對象,並返回指向新創建的對象。您正試圖將其分配給int。充其量,它應該看起來像int* a = new int; *a = 42;,在這段時間你的代碼負責刪除它。
現在如果你有一個像void func(int* pA) {}這樣的函數,並且有一個像int a = 42;這樣的局部變量,並且你想把它傳遞給你的函數,你可以調用你的函數,如func(&a);
第二個你的函數都在創建內存泄漏。您正在創建一個永遠不會被刪除的新指針。如果你想改變你的函數的值
3日,所有你需要的是這樣的:

void func1(int* pA) 
{ 
    *pA = 42; 
} 

,或者你可以做這樣的事情:

void func2(int& rA) 
    { 
     rA = 42; 
    } 

我想你不理解指針和引用的含義。

0

操作員新返回指針,所以你必須寫int* a = new int(42);。之後,你可以調用的函數如下:

fun1(&a); 
fun2(a); 

而且也不要忘記刪除分配的內存與新:

#include <iostream> 
void fun1(int ** i) 
{ 
    delete *i; 
    *i = new int(0); 
} 
void fun2(int *& i) 
{ 
    delete i; 
    i = new int(69); 
} 
int main() 
{ 
    using namespace std; 
    int *a = new int(42); 
    fun1(&a); 
    cout << "fun1: " << a << endl; 
    fun2(a); 
    cout << "fun2: " << a << endl; 
    delete a; 
}