使用引用变量和指针

时间:2016-01-05 04:58:21

标签: c++ variables pointers

  1. int &y=xint y=&x相同吗?

  2. s++*s++是否相同?

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

    我期待*s值为12

  4. #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

3 个答案:

答案 0 :(得分:3)

  

int &y=xint 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;

可以是任何东西。

答案 1 :(得分:3)

  与int &y=x相同的{p> int y=&x

在第一个y中是一个整数引用,它被初始化为x。 OTOH,您要尝试为int分配int *值,这会导致编译错误。

  

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

这是因为++优先于*,因此,首先s首先递增(因此指向未初始化的内存位置),然后取消引用

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

如果您想要预期价值,可以这样做 -

(*s)++;         //dereference first and then increment

答案 2 :(得分:1)

  

int &y=x与int int y=&x相同吗?

不近。第一个将x绑定到int - 引用y,第二个将int y初始化为地址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然后开始重新格式化你的硬盘(合法但不太可能)。