对于数组,与指针变量总有千丝万缕的关系。
int arr[3][4] = { 1,2,3,4, 5,6,7,8, 9,10,11,12}; int base; // 以下三个地址值相同,但类型不同,尺寸不一 printf("%p",&arr); // 0012FF18 printf("%p",arr); // 0012FF18 printf("%p",arr[0]); // 0012FF18 printf("%p",&arr[0][0]); // 0012FF18 //取值需要不同级别的解引用 printf("%d",**arr); // 1 printf("%d",*arr[0]); // 1 printf("%d",arr[0][0]); // 1 printf("%p",base=(int)&arr[0][0]); // 0012FF18 // +1的偏移值是其类型尺寸的偏移 printf("%d",(int)(&arr+1)-base); // 48 sizeof(int)*4*3 printf("%d",(int)(arr+1)-base); // 16 sizeof(int)*4 printf("%d",(int)(arr[0]+1)-base); // 4 sizeof(int) printf("%d",(int)(&arr[0][0])-base);// 0
一级指针,可以用一维数组名赋值。
而对于多维数组,与多级指针就不存在等价关系了。
对于n维数组,可以直接用一级指针去处理,因为n维数组在内存中也是线性存储的。
另外,n维数组,可以理解为其元素是n-1数组,这样,n维数组就可以用n-1维数组指针来表示。也可以用指针数组(其指针指向一个n-1维数组)来表示。所以从这个意义上说,这是一种降维的处理方式,对于符号“*”与“[]”,不是很严格地可以理解为有一定的等价性:
#include using namespace std;int main(){ int arr[3][4] = { 1,2,3,4, 5,6,7,8, 9,10,11,12}; int i,j; cout<< "1 二维数组下标遍历"<
数组指针也可以指向一维数组,但写法细节略有区别:
int a[4] = {11,22,33,44}; cout<

三维数组的遍历:
#include using namespace std;int main(){ int arr[2][3][4] = {0}; int* p = (int*)arr; int i,j,k; for(i = 0; i<2*3*4; i++) *p++ = i+1; p= arr[0][0]; // p = &arr[0][0][0]; for(i=0;i<2;i++) { for(j=0;j<3;j++) { for(k=0;k<4;k++) // 以下5种方式等价 //cout<< arr[i][j][k] <

-End-