- #include <stdio.h>
- #define ROW 4
- #define COL 2
- int main(void)
- {
- int zippo[ROW][COL] = {{2,4},{6,8},{1,3},{5,7}};
- int i,j;
- printf(" \n \n");
- for(i=0;i<ROW;i++)
- {
- printf(" &zippo[%d]=%p\n",i,&zippo[i]);
- }
- printf(" \n \n");
- for(i=0;i<ROW;i++)
- {
- for(j=0;j<COL;j++)
- {
- printf(" &zippo[%d][%d]=%p\n",i,j,&zippo[i][j]);
- }
- }
- printf(" \n \n");
- printf(" an integer user %d bytes\n",sizeof(int));
- printf(" \n \n");
- printf(" zippo= %p, &zippo=%p, zippo+1= %p\n",zippo,&zippo,zippo+1);
- //zippo是数组首元素的地址,它储存的值即是它本身的地址,zippo=&zippo
- //可以理解为它指向一个包含4元素的一维数组A
- //zippo+1表示指向A第二个元素,即zippo[1]
- printf(" zippo[0]= %p,ziopo[0]+1= %p\n",zippo[0],zippo[0]+1);
- //zippo[0]是zippo A数组中的第一个元素,可以理解为它指向一个包含2元素的一维数组B
- //zippo[0]+1表示指向zippo[0]的下一个元素,即&zippo[0][1]
- printf(" *zippo= %p , *zippo+1=%p\n",*zippo,*zippo+1);
- //*zippo表示取zippo指向的地址,即&zippo[0]
- //*zippo+1表示取zippo[0]指向的下一个地址,即zippo[0]+1,亦即 &zippo[0][1]
- printf(" zippo[0][0]= %d\n",zippo[0][0]);
- printf(" *zippo[0] =%d\n",*zippo[0]);
- //*zippo[0]对zippo[0]指向的地址取值,相当于zippo[0][0],因为zippo[0]指向数组B的第一个元素,
- printf(" **zippo=%d\n",**zippo);
- printf(" \n \n");
- printf(" zippo[2][1]= %d\n",zippo[2][1]);
- printf(" *(*(zippo+2)+1)= %d\n",*(*(zippo+2)+1));
- //*zippo=*(zippo+0)=zippo[0]
- //*(zippo+2)=zippo[2]
- //*(*(zippo+2)+1)=zippo[2][1]
- //结论:*(*(zippo+m)+n)=zippo[m][n]
- //对N维的数组取值时要用到N个*
- return 0;
- }
运行结果:
- jiang@ubuntujeos:~/c/20110825$ gcc testarray.c -o
- testarray.o;./testarray.o
- testarray.c:55:2: warning: no newline at end of file
- &zippo[0]=0xbf9f925c
- &zippo[1]=0xbf9f9264
- &zippo[2]=0xbf9f926c
- &zippo[3]=0xbf9f9274
- &zippo[0][0]=0xbf9f925c
- &zippo[0][1]=0xbf9f9260
- &zippo[1][0]=0xbf9f9264
- &zippo[1][1]=0xbf9f9268
- &zippo[2][0]=0xbf9f926c
- &zippo[2][1]=0xbf9f9270
- &zippo[3][0]=0xbf9f9274
- &zippo[3][1]=0xbf9f9278
- an integer user 4 bytes
- zippo= 0xbf9f925c, &zippo=0xbf9f925c, zippo+1= 0xbf9f9264
- zippo[0]= 0xbf9f925c,ziopo[0]+1= 0xbf9f9260
- *zippo= 0xbf9f925c , *zippo+1=0xbf9f9260
- zippo[0][0]= 2
- *zippo[0] =2
- **zippo=2
- zippo[2][1]= 3
- *(*(zippo+2)+1)= 3
为了方便看地址,我把十六进制的地址转换成十进制
bf9f925c 3214905948
bf9f9260 3214905952
bf9f9264 3214905956
bf9f9268 3214905960
bf9f926c 3214905964
bf9f9270 3214905968
bf9f9274 3214905972
bf9f9278 3214905976
如果想理解多维数组的内存图,可以看看下面这张图片:
最后看得有点头晕,记住这两个结论:
*(*(zippo+m)+n)=zippo[m][n]对N维的数组取值时要用到N个*。