2011-11-30 94 views
4

我知道int (*p)[5]是指一个指向5个整数的指针。 所以我的代码下面这个方案:为什么使用int(* p)[5]`的结果如此混乱?

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a[5]={0,1,2,3,4}; 
    int (*q)[5]=&a; 
    cout<<a<<endl;   
    cout<<q<<endl; 
    cout<<*q<<endl;   
    cout<<**q<<endl; 
    return 0; 
} 

在我的机器,结果是:

0xbfad3608 
0xbfad3608  //?__? 
0xbfad3608 
0 

我可以理解,*q意味着a[0]**q地址指的a[0]价值,但为什么qa*q具有相同的值?我头脑不好,应该是他们的地址!我完全困惑。有人请帮助我。请!

回答

8

看看这样说:

q == &a 
    *q == a 
    **q == *a 

你没尝试打印&a。如果你这样做,你会发现它具有与a相同的值。由于&a == a,q == &a*q == a,通过传递性q == *q

如果你想知道为什么&a == a,检查出Why is address of an array variable the same as itself?

+0

这是否意味着'&a == a ==&a [0]'? – zyc

+0

@zyc,不,但他们都开始在同一个地址。 – avakar

+0

是的,'&a == a ==&a [0]'。 –

1

,由于array被自动转换为pointer,刚刚有array的地址的值。因此,当您尝试打印使用<<a<<*q打印array时,您实际上正在打印其地址。

+0

是的,但我只是想打印它的地址。 – zyc

2

q&a是指向该阵列的指针。

*qa是“数组”。但是你不能真正将一个数组传递给一个函数(并且std::ostream::operator<<是一个函数);你确实传递了一个指向隐式创建的第一个元素的指针(称为指针衰减)。因此*qa成为指向数组的第一个元素的指针。

该数组的开头位于内存中与该数组相同的位置。由于所涉及的指针都不是指向char的指针(这些指针专门处理以便字符串文字将按预期工作),因此地址只是打印出来。