【问题标题】:same pointer gives different address when it is printed with another pointer?同一个指针用另一个指针打印时给出不同的地址?
【发布时间】:2014-10-09 15:27:03
【问题描述】:
#include<iostream>
using namespace std;
int main()
{
      int a[]={10,20,30,40,50};

      int *b,**c,*d;

      cout<<a<<endl;    ..............(1)

      cout<<b;          ..............(2)

      return 1;
}

如果我运行这个程序只包含 (1) 标记语句输出是

0x22fecc

但是如果我使用两个语句运行程序,即 (1) 和 (2) 那么输出是

0x22fec8 0x401d2e

Q1:为什么在 2 种情况下为 a 打印不同的值

Q2:如果我执行 b = a 然后打印 b 和 a 怎么办?

Q3:为什么 b 和 a 在 Q2 中给出相同的地址?它们现在是否相同,即它们共享相同的位置? b现在是a的别名吗?

Q4:如果我做 b = a+1 然后 cout

 Is cout<<a  is equivalent to  cout<<&a ?

我在 Win7 32bit 上使用代码块 13.12。

【问题讨论】:

  • 打印未初始化的b 是未定义的行为。此外,没有理由每次运行程序时地址都应该相同。

标签: c++ pointers


【解决方案1】:
Q1 : why different value printed for a in 2 cases

编译器可能正在优化 b。尝试在您的编译器上将优化设置为无。

Q2 : what if i do b = a and then print b and a ?

试试吧,让我们知道结果如何:)

Q3 : why b and a give same address of themselves in Q2 ? Are they same now i.e they share same location ? does b is an alias of a now ?

它们不同,但指向同一个位置。就像两张纸,上面都有你的家庭住址。

Q4 : if i do b = a+1 and then cout<< b why it gives address of a ? it should have given the address of a+1 ? 

它确实给出了 a+1 的地址。

【讨论】:

    【解决方案2】:

    如果你想为两个输出获得相同的值,那么插入语句

    b = a;
    

    在表达式中,数组被隐式转换为指向其第一个元素的指针。因此,在语句中,表达式 a 被转换为指向其第一个元素的指针并赋值给 b。

    在此声明中

    cout<<a<<endl;
    

    a 也被转换为指向其第一个元素的指针。将 a 分配给 b 后的结果

    cout<<a<<endl;
    

    cout<<b;
    

    将输出相同的值。

    这句话之后

    b = a+1
    

    b 将指向数组 a 的第二个元素(索引为 1)。

    编辑:哦,我明白了你的问题。似乎当函数 whrn 中未使用变量 b 时,编译器只是将其从生成的目标代码中删除。当使用变量 b 时,编译器会在堆栈上为其分配内存。所以a的地址会根据变量b是否被使用而改变。

    【讨论】:

    • 我不想要 b = a 我想知道的是,为什么 a 在仅包含 (1) 时打印为 0x22fecc 而当我包含 (1) 和 (2 ) 然后 a 被打印为 0x22fec8 我不在乎 b 正在打印什么?
    • 因为这是你第二次运行程序,地址不必和第一次一样。
    猜你喜欢
    • 1970-01-01
    • 2019-05-10
    • 2018-06-29
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2019-09-07
    相关资源
    最近更新 更多