2017-04-22 80 views
0

我有几个关于指针重新分配,指针比较以及是否在Q1,Q2和Q3中分别共享地址空间的问题。ptrA = ptrB等同于ptrA =&* ptrB?,并且空值共享一个地址空间吗?

int main() 
{ 
int var2 = 2; 
int varnull = NULL; 
int* myPtr_simple = &var2; 

//Q1) are these 2 statements equivalent in terms of reassigning 
//both myPtr_long and myPtr_short to what myPtr_simple points to? 
int* myPtr_long = &*myPtr_simple; 
int* myPtr_short = myPtr_simple; 

//Q2) are these 2 statements equivalent? 
std::cout<<(myPtr_short==myPtr_long)<<std::endl; //TRUE 
std::cout<<(*myPtr_short==*myPtr_long)<<std::endl; //TRUE 

//if var2 is non-null 
//(address spaces of var2, myPtr_short, myPtr_long are equal) 
std::cout<<(&*myPtr_short==&*myPtr_long)<<std::endl; //TRUE 
std::cout<<(&*myPtr_short==&var2)<<std::endl; //TRUE 
std::cout<<(&var2==&*myPtr_long)<<std::endl; //TRUE 

//Q3) if varnull is null 
//(myPtr_short and myPtr_long share address space, but not same as varnull...why?) 
myPtr_long = NULL; 
myPtr_short = NULL; 
std::cout<<(&*myPtr_short==&*myPtr_long)<<std::endl; //TRUE 
std::cout<<(&*myPtr_short==&varnull)<<std::endl; //FALSE 
std::cout<<(&varnull==&*myPtr_long)<<std::endl; //FALSE 

return 0; 
} 
+1

请勿取消引用NULL指针。 – Jonas

+3

Q1)。不,如果'myPtr_simple'为空,则第一个的行为是未定义的。 Q2)。不,一个是价值比较,另一个是指针比较。 Q3)。 '(&* myPtr_short ==&* myPtr_long)'是无稽之谈,因为这两个ptrs都是空的,行为是未定义的。 – George

+3

不是一个答案,但你真的需要额外的东西,'std :: endl'呢? ''\ n''结束一行。 –

回答

0

Q1)是等价的重新分配都myPtr_long和myPtr_short什么myPtr_simple点而言这2条语句?

int* myPtr_long = &*myPtr_simple; 
int* myPtr_short = myPtr_simple; 

是,这些有同样的效果。

Q2)这两个语句是否相等?

std::cout<<(myPtr_short==myPtr_long)<<std::endl; //TRUE 
std::cout<<(*myPtr_short==*myPtr_long)<<std::endl; //TRUE 

不,绝对不是。 myPtr_short==myPtr_long检查myPtr_shortmyPtr_long是否是指向同一对象的指针。 (这不完全正确,但现在已足够接近。)*myPtr_short==*myPtr_long检查两个引用的对象是否保持相同的值。

int i = 0, j = 0; 
int* pi = &i; 
int* pj = &j; 

现在,pi == pj是不正确的。 pipj指向不同的对象。

*pi == *pj是真实的,因为两个ij正好有值0,并且0 == 0显然是正确的。

Q3)如果varnull为空(myPtr_short和myPtr_long共享地址空间,但不一样的varnull ......为什么?)

myPtr_long = NULL; 
myPtr_short = NULL; 
std::cout<<(&*myPtr_short==&*myPtr_long)<<std::endl; //TRUE 
std::cout<<(&*myPtr_short==&varnull)<<std::endl; //FALSE 

&*myPtr_short&*myPtr_long只是myPtr_shortmyPtr_long。他们都是NULL,因为这是你刚刚分配给他们的价值。

&varnull不是NULL:它是一个指向对象的有效指针。您用来初始化该对象的价值无关紧要,因为这不会检查varnull的价值。

+0

这是非常有帮助的谢谢!我猜&varnull不是NULL,因为它有一个为int定义的专用地址空间。第二季度的答案非常清楚我对指针的理解。 – jorjor17

+0

@ jorjor17是的,'varnull'是一个'int'类型的变量,'&varnull'是一个指向该变量的指针,因此它保存一个保存用于存储'int'的地址。 'myPtr_short'不是,因为'NULL'不是用于存储'int'的地址,也不是其他值。 (注意:“地址空间”这个术语有特定的含义,听起来并不像你想要的那个具体含义,所以我在回答和评论时尽量避免使用这个术语。 ) – hvd

+1

@ jorjor17,还要注意'int varnull = NULL;'和'int varnull = 0'是一样的;'你没有创建一个“int指向NULL”的指针,而是一个整数值为0 –