2015-05-22 115 views
-1

Heloo GUYS ..我將一個別名傳遞給函數中的指針,並且在該函數中我將指針指定給另一個變量。這改變了在主函數中傳遞的指針的地址。我會告訴ü例如我的代碼。這給人的輸出40通過另一個指針更改指針的地址

#include <iostream> 
using namespace std; 
void foo(int* &p){ 
    int z=40; 
    p=&z; 
} 
int main(){ 
    int x=10; 
    int *p=&x; 
    foo(p); 
    cout<<*p; 
} 

但是當我嘗試做這一切的一個主要功能,則指針並沒有改變的地址,以便爲輸出中..這是我的代碼

#include<iostream> 
using namespace std; 
int main() 
    { 
     int a=1, b=2, c=3; 
     int *p, *q; 
     p=&a; 
     q=*&p; 
     p=&c; 
     cout<<*q<<endl; 

    } 

它給出輸出1而不是3.THA的NK ..

+4

你的第一個例子有未定義的行爲。 – juanchopanza

+1

那是因爲你沒有改變'q'。你正在改變'p'。 – NathanOliver

+4

'q = *&p;'和'q = p'一樣;' – molbdnilo

回答

0
void foo(int* &p){ 
    int z=40; 
    p=&z; 
} 

上面的代碼是不安全因爲誰叫foo現在有一個指向銷燬堆棧變量。

它給人的輸出中1甚則3.THANKs ..

當然重要。瞭解指針是什麼以及它是如何工作的。

int a=1, b=2, c=3, *p, **q; 
p=&a; 
q=&p; 
p=&c; 
std::cout << **q << std::endl; 
0

只是覺得你應該知道,在FOO()你分配指針與自動存儲時間的變量,這意味着它所指向時富回報實際上是不確定的地址(在一個更大的程序,這是一個等待發生的災難)。

在你的第二個例子中,你只分配一次q。在作業期間,參考文獻是其所涉及的對象的。引用依賴不會被繼承。

0

那是因爲你沒有改變q。你正在改變p。當你做

q=*&p; 

它是一樣的

​​

所以,你做了什麼分配p指向a。然後您將p的值分配到q,所以現在q指向a。然後您將c的地址分配給p。這樣做對q沒有任何影響,因此q仍然指向a

您還應該閱讀Can a local variable's memory be accessed outside its scope?以瞭解爲什麼您的第一個示例具有未定義的行爲。

0

你爲什麼期望得到答案爲3

​​

qp那麼你改變那裏p點。 p指向c,但q仍然會指向前一個地址p

除非您重新指定q指向p,否則它仍將指向a

1
void foo(int* &p){ 
    int z=40; 
    p=&z; 
} 

這裏p參考的指針。這意味着當你修改它時,你也會修改引用的指針。

當你調用foo

int main(){ 
    int x=10; 
    int *p=&x; 
    foo(p); 
    cout<<*p; 
} 

你說,參考在功能foo命名p是指在功能main命名p指針因此你foop會影響pmain

#include<iostream> 
using namespace std; 
int main() 
    { 
     int a=1, b=2, c=3; 
     int *p, *q; 
     p=&a; 
     q=*&p; 
     p=&c; 
     cout<<*q<<endl; 

    } 

在這裏,你有沒有參考任何地方,你只要有一個指針,你複製到另一個指針。 q=*&p相當於q=p

關鍵的區別,這裏要注意的是,操作者&在第一爲例而&操作者在第二示例中的意思是「的地址」是指「參考」。

如果你想最接近等同於第二個第一樣本,試試這個:

#include<iostream> 
using namespace std; 
int main() 
{ 
    int a=1, b=2, c=3; 
    int *p, *&q = p; 
    p=&a; 
    q=*&p; 
    p=&c; 
    cout<<*q<<endl; 

} 

而在後一種情況下,你同時擁有一個&int *p, *&q = p;&意思是「參考」這意味着「地址」在q=*&p;

0

讓我只考慮你的第二個例子,我添加了一些評論,並希望它會澄清你爲什麼得到該輸出。

int a=1, b=2, c=3; 
    int *p, *q; 
    p=&a; //P now points to the variable a 
    q=*&p; // q now points to the value in pointer p 
    p=&c; 
    cout<<*q<<endl; //You are printing value from pointer q 

請注意,您並未更改指針的地址,而只是更改指針指向的地址。