下面我用一个例子详细说明
这里开始补充一点知识(
二维数组名也是一个指针常量
)
由图可以得出*与[]运算是一样的,二维数组名加一个[]或者*代表变成行指针,二维数组名加上两个**或者[]代表元素,二者可以混合使用;&代表的是取地址,&与*和&与[]是逆运算。
itn a [3][4] = {
{1,3,5,7},{9,11,,13,15},{17,19,21,23}};这里是定义的一个语句,后面的全部围绕这个展开,这里我画一个图帮助理解。
a代表第0行首地址 a[0]代表a[0][0]的地址
a+1代表第一行首地址 a[0]+1代表a[0][1]的首地址
a+2代表第二行首地址 a[0]+2代表a[0][2]的首地址 由此可以推
a+i代表行号为i的行首地址 a[i]+j代表a[]i[j]的地址
*(a[i]+j)代表元素a[i][j] *(*(a+i)+j)代表元素a[i][j] 这里这两者是等价的
补充一点a[i]代表第i行首地址,且是一个列地址
printf(
“%d,%d\n”,a,*a
); //a行地址,*a列地址 printf(“%d,%d\n”,a[0],*(a+0)); //a[0]列地址,*(a+0)也是列地址 printf(“%d,%d\n”,&a[0],&a[0][0]);//&a[0]行地址,&a[0][0]列地址 这里都是打印出0xa11这样相同的地址,注意这里的地址是我随便给的
printf(“%d,%d\n”,a[1],a+1);//a[1]是列地址a+1是行地址 printf(“%d,%d\n”,&a[1][0],*(a+1)+0);//&a[1][]0],*(a+1)+0代表的列地址 这里都是打印出0xa111这样的相同地址
,注意这里的地址是我随便给的
printf(“%d,%d\n”a[2],*(a+2));//a[2]代表的列地址,*(a+2)代表的列地址 printf(“%d,%d\n”,&a[2],a+2);//&a[2],a+2都是代表的行地址 这里都是打印出0x111122这样的地址,
注意这里的地址是我随便给的
printf(“%d,%d\n”a[1][0],*(*(a+1)+0));//这里不是代表的地址,而是值,他们都是打印出9这个数字
printf(“%d,%d\n”,*a[2],*(*(a+2)+0));//这里都是打印出17这个数。
这里的打印与取地址一定要配合上面的这个图分析看。