#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。
答案 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而改变。