当用另一个指针打印时,同一指针给出不同的地址?

时间:2014-10-09 15:27:03

标签: c++ pointers

#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个案例中打印不同的值

Q2:如果我做b = a然后打印b和a?

怎么办?

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

问题4:如果我做b = a + 1然后cout&lt;&lt; b为什么它给出了一个地址?应该给出+ 1的地址?

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

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

2 个答案:

答案 0 :(得分:1)

Q1 : why different value printed for a in 2 cases

编译器可能正在优化b out。尝试在编译器上将优化设置为none。

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 ? 

确实给出了地址+ 1。

答案 1 :(得分:0)

如果要为两个输出获取相同的值,则插入语句

b = a;

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

在本声明中

cout<<a<<endl;

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

cout<<a<<endl;

cout<<b;

将输出相同的值。

在此声明之后

b = a+1

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

编辑:哦,我理解你的问题。似乎当函数中没有使用变量b时,编译器只是将其从生成的目标代码中删除。当使用变量b时,编译器在堆栈上为它分配内存。因此,a的地址根据是否使用变量b而改变。