二维数组与指针的有关问题

二维数组与指针的问题定义一个二维数组a[2][2],为什么&a[0]可以等同于a,&(&a[0][0])不等同于a呢?[解决办法

二维数组与指针的问题
定义一个二维数组a[2][2],为什么&a[0]可以等同于a,&(&a[0][0])不等同于a呢?

[解决办法]
1、数组名是指向数组首地址的指针,所以

a和&a[0], &a[0][0]都是同一个地址

而&(&a[0][0])这是行错误代码,因为&a[0][0]本身已经是一个常值了,下面是一个测试程序:

C/C++ code
#include <iostream>using namespace std;int main(){    int a[2][2] = {1, 2, 3, 4};    cout<<"a = "<<(void*)a<<endl;    cout<<"&a[0] = "<<(void*)&a[0]<<endl;    cout<<"&a[0][0] = "<<(void*)&a[0][0]<<endl;    //cout<<"&(&a[0][0]) = "<<(void*)&(&a[0][0])<<endl;        return 0;}
[解决办法]
要明白,二维数组的概念。

&a[0][0] 在值上已经和 a 或者 &a[0] 相等,只是它们的意义不大一样,可以看看指针++后指向的元素 就知道了。

这么理解,数组嘛,一系列元素连续存放,那么取第一个元素的地址,不就是数组的首地址么?所以&a[0][0]就得到数值上的a
[解决办法]
a[0]当然存在
只是对你的那个数组来说
a[0]有两个含义
1.a[0][0]与a[0][1]所占据的那块内存
2.指向 a[0][0] 的指针

顺便说一句
哦,已经说过了
参见15楼