int a[5][10]={1,2}; int (*p)[10]=a; cout<<p<<endl; cout<<p[0]<<endl; cout<<p[9]<<endl;
int(*p)[10]定义了一个指向二维数组的指针p,赋给它10个长度。然后把a数组的值赋给(*p)[10],注意,这里是a数组是5行10列的,放入(*p)[10]是把a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5],a[0][6],a[0][7],a[0][8],a[0][9]放入(*p)[0]中,同理,将a[1][0...9]放入(*p)[1]。最后(*p)[10]中的值只有五行被初始化为a数组的值了。 在本例中,p和p[0]是同一个意思,就是数组a的起始地址,等价于cout<<a<<endl,但是他们有区别,p指向的是整个数组的首地址,而p[0]则指向a的首行首地址(继续往下看...)。 p[9]则值内存为p数组分配的(*p)[9]的地址。如果你仔细验证程序的输出结果,你就会发现: #include<stdio.h> #include "iostream" using std::cout; using std::endl; using std::hex; void main() { int a[5][10]={1,2}; int (*p)[10]=a; cout<<p<<endl; cout<<p[0]<<endl; cout<<p[9]<<endl; } 输出结果为(不同机器结果不同): 0012FEB8 0012FEB8 00130020 如果你验证它们这些地址存储的值,你会发现: #include<stdio.h> #include "iostream" using std::cout; using std::endl; using std::hex; void main() { int a[5][10]={1,2}; int (*p)[10]=a; cout<<*p<<endl; cout<<(*p)[0]<<endl; cout<<(*p)[9]<<endl; } 输出结果为: 0012FEB8 1 0 这是p和p[0]的区别就体现出来了。因为*p并不是取首元素的值,它这时才相当于p[0]。那如何通过p取得首元素的值呢,很显然,应该再加一个*操作符,如下: cout<<**p<<endl; 这时输出结果自然就会和(*p)[0]一样是1了。
int **P = Graph; **p 等价 Graph[0][0] *p 等价 Graph[0] *(p+n) 等价 Graph[n] *(*(p+n)+m) 等价 Graph[n][m]