#include <stdio.h> void main() {int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int *p; //a是数组行的首地址而a[0]是数组的0行0列的地址,注意区别!!!! //一开始a(这是个地址值)等于a[0](这也是个地址值),都指向元素a[0][0]的地址 //a[0]相当于{a[0][0],a[0][1],a[0][2],a[0][3]}的数组名 printf("a========%d\n",a); printf("a[0]========%d\n",a[0]); printf("\n"); //计算机按字节编址,int在内存中占有4个字节,每两个元素之间相差4个字节 printf("&a[0][0]===&&&&&&&&&&&&&====%d\n",&a[0][0]); printf("&a[0][1]===&&&&&&&&&&&&&====%d\n",&a[0][1]); printf("&a[0][2]===&&&&&&&&&&&&&====%d\n",&a[0][2]); printf("\n"); //第一行和第二行相差16个字节 printf("&a[0][0]===&&&&&&&&&&&&&====%d\n",&a[0][0]); printf("&a[1][0]===&&&&&&&&&&&&&====%d\n",&a[1][0]); printf("\n"); //a[0]+1相当于以a[0]为数组名的地址加1,一开始a[0]指向a[0][0]即现在指向了a[0][1]这个元素的地址 //a[0]+1与&a[0][0]+1值是相等的 printf("a[0]+1======%d\n",a[0]+1); printf("&a[0][0]+1======%d\n",&a[0][0]+1); printf("\n"); //下一行的行地址(也a+1比a大了16个字节),简称“行地址” printf("a+1======%d\n",a+1); printf("\n"); //*(a+1)取下一行的行地址里面的值,取行首元素的地址,即下一行的的第一个元素的地址,简称“元素地址” //*(a+i)是第i行的第一个元素的地址即a[i][0]的地址 *(a+1)指向的是第i行的首元素的地址,注意是“首元素”!!! printf("*(a+1)===*************===%d\n",*(a+1)); printf("\n"); //取下一行的的第一个元素的地址里面的值也是首元素的值,即a[1][0]的值 printf("**(a+1)===*************===%d\n",**(a+1)); printf("\n"); //姑且认为a[0]为数组名,a[0]+1指向下一个元素即a[0][1],所以*(a[0]+1)==3 printf("*(a[0]+1)===*************===%d\n",*(a[0]+1)); printf("*(a[0]+2)===*************===%d\n",*(a[0]+2)); printf("\n"); printf("*(a[0]+4)===*************===%d\n",*(a[0]+4)); printf("\n"); printf("*(&a[0][0]+1)====*************==%d\n",*(&a[0][0]+1)); printf("\n"); //总之,a是只指向二维数组行“首”地址,简称“行首址” //a[0]是指向二维数组元素的第一个元素的地址 for(p=a[0];p<a[0]+12;p++) { if((p-a[0])%4==0)printf("\n"); printf("%4d",*p); } printf("\n"); }