使用引用变量和指针

Playing with reference variables and pointers

本文关键字:指针 变量 引用      更新时间:2023-10-16
  1. int &y=xint 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;
}

我得到的输出:

11116422280

CCD_ 7与CCD_。

在第一个CCD_ 9中是一个被初始化为CCD_。OTOH,在第二秒内,您试图为int分配一个值int *,这会导致编译错误。

为什么*s++给了我一些错误的结果?我原以为*s的值是12

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

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

如果你想要期望值,你可以这样做-

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

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。之后,CCD_ 20指向下一个元素。但这不是一个有效的地址。下次访问*s时,程序将显示未定义的行为。线路输出:

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

可以是任何东西。

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

不太可能。第一个将x绑定到int-引用y,第二个用地址x初始化int-y

两者都可以干净地编译,但第二个只有严重扭曲滥用运算符重载:

{
    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++相同吗?

当然不是,尽管它们在您的示例中具有相同的效果,因为您放弃了结果:

  • 第一个递增CCD_ 32并返回其递增前的值
  • 第二个做了同样的事情,但随后取消了引用

在这两种情况下,s此后都指向对象后面,并且可能不会因未定义行为(UB)而被取消引用
这解释了你得到的奇怪数字,但也可能导致你的程序只打印42,然后开始重新格式化你的硬盘(合法但不太可能)。