【问题标题】:Playing with reference variables and pointers使用引用变量和指针
【发布时间】:2016-01-05 04:58:20
【问题描述】:
  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;
}

我得到的输出:

11 11 6422280

【问题讨论】:

  • r=&amp;p 给你一个错误的原因是因为你声明了一个int,这意味着你告诉编译器,“嘿,我要在内存中存储一​​个整数。”但不是给它一个整数,而是给它一个存储整数的地址。这是类型不匹配。编译器试图将其隐式转换为 int,但地址看起来与 int 完全不同。因此出现错误。
  • 这些是要问的特殊问题。 1. 由于一个是错误而另一个不是,它们不可能相同。 2. 效果不一样,不可能一样。

标签: c++ variables pointers


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • (*s)++ 修复了它。感谢您告诉我 ++ 的优先级。 's++' 呢?那是无效的吗?它有什么作用?
  • @Abhilashk s++ 将指向变量 p 的内存地址之后的位置。此地址可能无效或未初始化,因此取消引用会导致未定义的行为。但是如果你这样做s++而不是取消引用它并打印地址,那么恕我直言应该没有问题。
  • “但是如果你执行 s++ 并且没有取消引用它并打印地址,那么恕我直言应该没有问题”你能以编程方式显示它并引用预期的输出吗?
  • @Abhilashk 它只是s++;,然后打印s,预期输出将是p 加上sizeof(int) 的地址。
【解决方案2】:

int &amp;y=xint y=&amp;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 &amp;y=x 是否与 int int y=&amp;x 相同?

    几乎没有。第一个将x绑定到int-reference y,第二个用x的地址初始化inty

    两者都可以编译干净,但第二个只有严重扭曲滥用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,然后开始重新格式化你的硬盘驱动器(合法但不太可能)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 2021-06-07
      • 2016-05-03
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多