2016-01-05 74 views
-8
  1. int &y=x是否与int y=&x相同?玩参考变量和指针

  2. s++*s++一样吗?

  3. 同样在下面的代码中,为什么*s++给我一些错误的结果?

    我期待*s值为12

#include <iostream> 
using namespace std; 

int main() 
{ 
    int p=10; 
    int &q=p; //q is a reference variable to p 
    //int r=&p; //error: invalid conversion from 'int*' to 'int' 
    int *s=&p; //valid 
    q++;   
    *s++;  //here even s++ works, and cout<<*s does not give 12 but some lengthy number 
       //and cout<<s gives some hexadecimal, I'm guessing thats the address 
    cout<<p<<endl<<q<<endl<<*s; 
} 

输出我得到:

11 
11 
6422280
+1

“r =&p”给你一个错误的原因是你声明了一个int,意思是你告诉编译器,“嘿,我要在内存中存储一​​个整数。”但是不是递交一个整数,而是递交了一个存储整数的地址。这是一种类型不匹配。编译器试图隐式地将它转换为int,但地址看起来不像整数。因此错误。 –

+1

这些都是需要特别提出的问题。由于一个是错误而另一个不是,所以它们不可能是相同的。 2.因为它们不具有相同的效果,它们不可能是相同的。 – molbdnilo

回答

3

int &y=x一样int y=&x

不,他们是非常不同的。

int x; 
int& y = x; // y is a reference to x. 

在另一方面,

int x; 
int y = &x; // Should be compiler error. 
      // Initializing y with a pointer. 

行:

*s++; 

等同于:

int* temp = s; 
s++; 
*temp; 

你正在评估*temp但副作用是,你是增加的编号为s。之后s指向下一个元素。虽然这不是一个有效的地址。下次您访问*s时,程序会显示未定义的行为。该行的输出:

cout<<p<<endl<<q<<endl<<*s; 

可以是任何东西。

3

int &y=xint y=&x相同。

在第一个y是一个整数参考,它被初始化为x。 OTOH,在第二个中,您尝试将int的值指定为int *,这会导致编译错误。

为什么* s ++给我一些错误的结果?我期待* S值是12

这是因为++优先于*,因此,第一s首先递增(从而指向未初始化的存储器位置),然后解除引用。

哪个导致未初始化的内存位置取消导致未定义的行为

如果要预期值,你可以做到这一点 -

+0

(* s)++修正了它。感谢您告诉我关于++的优先级。 '++'怎么样?那是无效的?它有什么作用? –

+0

@Abhilashk'++'会指向位置变量'p'的内存地址。该地址可能无效或未初始化,因此解除引用会导致未定义的行为。但是如果你使用''++'而不是取消引用并打印地址,那么恕我直言不应该有任何问题。 – ameyCU

+0

“但是,如果你做的s ++,而不是取消引用它和打印地址,那么应该没有问题恕我直言” 可以请你以编程方式显示它,并报价预期的产出? –

1

int &y=x一样INT int y=&x

不远。第一个绑定xint-参考y,第二个初始化inty与地址x

既可以做干净编译,但仅次于严重曲解滥用operator overloading

{ 
    int y; 
    int& x = y; 
} 
{ 
    // Only for demonstration, never do something this crazy for real 
    struct { int operator&() { return 0; }; } x; 
    int y = &x; 
} 

s++*s++一样吗?

当然不是,虽然他们有相同的效果在你的榜样,因为你放弃的结果:

  • 第一增量s,并返回其预先递增值。
  • 第二个是一样的,但后来解除引用。

在两种情况下,此后s指向物体的后面,并且可以不上的Undefined Behavior (UB)疼痛解除引用。
这解释了您得到的好奇号码,但也可能导致您的程序仅打印42,然后开始重新格式化您的硬盘(合法但不太可能)。