2012-07-27 105 views
2
#include <iostream> 

using namespace std; 

int main(int argc, char **argv) { 
    int a=5; 
    int *p,*q; 

    *p = a; 
    *q = *p; //line 6 

    cout<<*p<<p<<*q<<q; 

    return 0; 
} 

該程序掛起。這似乎是問題在第6行。爲什麼呢?將一個指針複製到C++中的其他指針

+3

你沒有爲int分配內存。它在'* p = a;'上變得不可預測。 – 2012-07-27 17:09:22

+0

'#include '= C++。您應該避免在C++中使用原始指針... – 2012-07-27 17:13:03

+1

C和C++是兩種不同的語言,並且沒有稱爲「C/C++」的語言。你的代碼顯然是C++。 – 2012-07-27 17:14:55

回答

5

是的,那些懸掛指針,你遇到未定義的行爲。

不能解引用指向內存的指針,你沒有自己:

int* p; 
*p; //illegal 

int* x = NULL; 
*x; //illegal 

int* y = new int; 
*y; //OK! 

正確的版本是:

int main(int argc, char **argv) { 
    int a=5; 
    int *p = new int; 
    int *q = new int; 

    *p = a; 
    *q = *p; //line 6 

    cout<<*p<<p<<*q<<q; 

    delete p; 
    delete q; 

    return 0; 
} 

int main(int argc, char **argv) { 
    int a=5; 
    int *p; 
    int *q; 

    p = &a; 
    q = p; //line 6 

    cout<<*p<<p<<*q<<q; 

    return 0; 
} 

的更正確的版本:

int main(int argc, char **argv) { 
    int a=5; 
    int p,q; 

    p = a; 
    q = p; //line 6 

    cout<<p<<p<<q<<q; 

    return 0; 
} 

無指針:)

+0

p地址a,那麼q擁有一個地址? – 2012-07-27 17:21:01

+0

在您更正的第一個版本中 – 2012-07-27 17:21:59

+0

@ user1139048 p不包含a的地址。在它指向的地址中(分配給新的),它複製a的值。 – 2012-07-27 17:24:48

4

第5行也有問題。你已經聲明瞭指針,但是你沒有把它們指向任何東西,這不會自動發生。像你一樣,取消引用未初始化的指針可能會導致程序崩潰。

這樣的事情會更好。

int main(int argc, char **argv) { 
    int a=5; 
    int b, c; 
    int *p,*q; 

    p = &b; // make p point at b 
    q = &c; // make q point at c 
    *p = a; 
    *q = *p; //line 6 

    cout<<*p<<p<<*q<<q; 

    return 0; 
} 
2

你的代碼假定有存儲在P時 沒有的東西。

這是你正在嘗試做什麼?

int a=5; 
int *p,*q; 

p = &a; 
q = p; //line 6 

cout<<(*p)<<p<<(*q)<<q; 

在上面的代碼中,在所述程序中,p和q指向同一個地址的末端 - 的整數被存儲在何處的地址

+0

實際上我想通過做* * =知道q所持有的地址是什麼? – 2012-07-27 17:24:15

+0

q可以保存你想要的任何地址 - 在上面的情況下,q將保持與p的值相同的地址 – 2012-07-27 17:27:45

+0

,但是當我打印p和q時,兩者都不相同,這意味着它們不具有相同的地址。 – 2012-07-27 17:29:59

0

兩個指針可以使用另一個變量作爲被複制如下:

#include<iostream> 
using namespace std; 


int main() 
{ 
int *p,*q; 
int a = 5; 
p = &a; 
q = &(*p); 
a = 10; 
std::cout<<*p<<std::endl; 
std::cout<<*q<<std::endl; 
} 

但是在上面這個例子中,兩個指針指向的地址是不一樣的。 這將使這兩個指針來將使用引用

通過變量 在C++中另一個很好的方式確定要做到這一點
int a = 5; 
int& p = a; 
int& q = p; 
std::cout<<p<<std::endl; 
std::cout<<q<<std::endl; 
std::cout<<&p<<std::endl; 
std::cout<<&q<<std::endl; 

結果:
0xbf9e7498
0xbf9e7498