首先二级指针是一个指向指针的指针
比如:int **p;
二维数组是一个可以理解为矩阵数据的变量
比如 : int a[2][3]={{1,2,5},{7,9,11}};
但是容易理解错误的是:a虽然和以为数组一样也是一个地址常量,但是二维数组的数组名a所表示的地址是一个
指向装有一维数组地址的空间(就是说a的地址指向一个地址,被指的地址就是一位数组的地址)
比如这里的数组名a的地址指向a[0],a[0]是一个装有一维数组地址的指针常量。
比如:*a 等价于a[0]
*(a+1) 等价于a[1]
而a[0]注意是一个装有地址的常量,指向一维数组a[0][0]。
#include<iostream>
using namespace std;
int main()
{
int a[3][3]={1,2,3,4,5,6,7,8,9};
int y=0;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
y+=(*(a+i))[j];
cout<<y<<endl;
}
}
int m;
int **p;
m=*(a[0]+1); //说明a[0]是一个常量指针,可以用指针的操作符*
cout<<m<<endl;
//p=a; //是不可以的,因为p是一个指向int指针的指针,而a是一个指向整型数组指针的指针
cout<<"a[0]"<<a[0]<<endl; //二维数组a的第一个一维数组的地址
cout<<"*a"<<*a<<endl; //说明指针常量a指向的是一个指针,这个指针就是一维数组指针a[0]的首地址
return 0;
}