怎样理解 a[0]与*(a+0)等价,二维数组元素a[i][j]可表示成
*(*(a+i)+j), 不理解*(a+i)这里。
a是数组名,是一个指针常量,指向的是数组的首地址~~~所以a[0]<=>*(a+0)..[]运算符就是取偏移量,而*可以理解为解引用~就是取地址上的值~~
二维数组则有首地址,行地址,行首地址的分别~~
a[i][j]~~不用语言会有不同的解释,大部分都是行优先~~~如果是列优先的语言,上面那句话改下就行了~~
a是这个数组的首地址,&(a[i][0])是这个数组第i行的首地址,a[i]是这个数组的第i行的行地址~~其实后两者是一样的~
按行优先开始~~首先取行地址的偏移量 a[i]<=>*(a+i),然后在这个地址基础上再加上列地址的偏移量,记住
a[i]是第i行的行地址,不是“值”~~&(a[i][j])<=>*(a+i)+j,地址取到了~~现在进行解引用~~
*(*(a+i)+j), 不理解*(a+i)这里。
a是数组名,是一个指针常量,指向的是数组的首地址~~~所以a[0]<=>*(a+0)..[]运算符就是取偏移量,而*可以理解为解引用~就是取地址上的值~~
二维数组则有首地址,行地址,行首地址的分别~~
a[i][j]~~不用语言会有不同的解释,大部分都是行优先~~~如果是列优先的语言,上面那句话改下就行了~~
a是这个数组的首地址,&(a[i][0])是这个数组第i行的首地址,a[i]是这个数组的第i行的行地址~~其实后两者是一样的~
按行优先开始~~首先取行地址的偏移量 a[i]<=>*(a+i),然后在这个地址基础上再加上列地址的偏移量,记住
a[i]是第i行的行地址,不是“值”~~&(a[i][j])<=>*(a+i)+j,地址取到了~~现在进行解引用~~
*(&(a[i][j]))<=>a[i][j]<=>*(*(a+i)+j)~~
int *p[5],首先它是一个数组,它的大小是5,它里面存放的数据类型是int *,也就是整型指针。 所以它叫指针数组、 (从右向左解析这个表示)
int (*p)[5],首先p是一个指针,指向大小为5的数组,因此这叫数组指针。(括号优先)