关于c/c++中的二维数组与指针
设a是一个一维数组的数组名,则a表示其第一个元素的地址(即&a[0]),而&a表示整个数组的地址!尽管两者值相同(&a[0]==&a),因此&a是地址,*(&a)也是地址,**(&a)是第一个元素(见c++pp第245,246页和c第192页)
将非const值赋给const变量是合法的,反之是非法的,因此,在函数声明中形参应尽可能使用const,这样无论const和非const实参都能传递给函数(c++pp263页)
#include <iostream> using namespace std; int main() { int x[4][3]={1,2,3,99,5,6,7,8,9,10,11,12}; int (*p)[3] = x; //在声明的时候,这里指p是这样一种指针类型:(*)[3],即指向3个int的指针(每次自增1的长度为3个int的长度)。不要做其他理解!! cout << x << endl; cout << (*p)[3] << endl; cout << *p[3] << endl; // []的优先级高于*,所以先解释为p[3],即*(p+3),而p是指向3个int的指针,所以p+3指向{10,11,12}(即保存{10,11,12}的地址),所以*(p+3)(即p[3])为10的地址,所以*p[3](即*(*(p+3)))为10 cout << *(*(p+3)) << endl; int a[2][3]={{1,2,3},{4,5,6}}; int i,j; int (*k)[3]; k = a; cout << "a:" << a <<endl; cout <<"&a[0][0]: " << &a[0][0] << endl; cout << "k: " << k << endl; // 第一个一维数组的地址!! cout << "k+1: " << (k+1) << endl; //第二个一维数组的地址!! cout << "k+1: " << *(k+1) << endl; cout << "*k: " << *k << endl; // 第一个一维数组的第一个元素的地址!! cout << "**k: " << **k << endl; // 第一个一维数组第一个元素 // 综上所述,就像一维数组一样,设a是一个一维数组的数组名,则a表示其第一个元素的地址(即&a[0]),而&a表示整个数组的地址!!尽管两者值相同(&a[0]==&a),因此&a是地址,*(&a)也是地址,**(&a)是第一个元素(见c++pp第245,246页和c第192页) for (i=0;i<2;i++) { cout << "k[i]: " << k[i] << endl; for (j=0;j<3;j++) cout << k[i][j] << "##" << &k[i][j] << endl; } return 0; }