对于这样的一个 指针:int (* p)[3]; kai在回答前面一位的疑惑时有些说法是错误的 int (* p)[3] 应该是指向具有3个元素的一维数组的指针,而不是指向二维数组的指针 如编译这样的情况: int a [2][3] = { {1,2,3}, {4,5,6} }; int (* p)[3] = a; //正确 int (* p)[3] = &a[0]; //正确 int (* p)[3] = &a[0][0]; //编译错误:cannot convert from 'int *' to 'int (*)[3] 如果要用这个指针来访问a[i][j]的元素时候 可以有两种方式:1 : *(p[i]+j) 2 : *(*(p+i)+j) 这两种得到的结果都是一样的,都等于a[i][j]的值 下面看看程序执行结果: #include <iostream> using namespace std;
int main() { int i = 0, j = 0, k = 0; // manipulate data with two dimensional array through pointer cout<<"manipulate data with two dimensional array through pointer"<<endl; int a [2][3] = { {1,2,3}, {4,5,6} }; int (* p)[3] = &a[0]; for(i = 0; i<2; i++) { for(j = 0; j<3; j++) { cout<<*(*(p+i)+j)<<" "; } cout<<endl; } cout<<endl;
for(i = 0; i<2; i++) { for(j = 0; j<3; j++) { cout<<*(p[i]+j)<<" "; } cout<<endl; } cout<<endl; } 打印出的结果为: manipulate data with two dimensional array through pointer 123 455 123 456 这个说明 int (*b)[3]确实指向了一个一维数组,在这里一共有2个一维数组,每个数组都 有3个元素,因此,这个指针加1就开始指向了第二个一维数组,即a[1][0]; 下面用图表来表示在内存里面的数据分布情况 b值 *b值 **b值 b: 100 200(内存地址是100) 1 (内存200处的数据) 101 203 (内存地址是101) 2 3 4(内存203处的数据) 5 6 所以a[1][2] 这个数据是6,可以这样表示*(b+1)即等于203,然后 (*(b+1)+2)等于206,所以*(*(b+1)+2)等于6 也可以这样b[i]等于指向第 i 个一维数组 ,所以b[1]等于203 然后b[1]+2等于206,所以*(b[1]+2)==*(*(b+1)+2)==b[1][2]==6; 以上只是我的一些见解,请大家指教