在二维数组里,这5个的确相等,C语言中的数组是顺序存储的,用一片连续的地址依次存放各数组元素的值。
一维数组:假设arr[10]是一个一维数组,那么数组名arr代表数组的起始地址,也就是arr[0]的地址,程序可以根据起始地址计算出任何一个数组的元素相对于起始地址的偏移量,例如第8个元素arr[8]的地址就是arr+8,所以arr[8]=*(arr+8),而且系统内部也确实是这样来处理的。
二维数组:假设arr[10][10]是一个二维数组,数组名仍然代表数组的起始地址。二维数组arr[10][10]可以看作一个一维数组,其每个数组元素又是一个一维数组,比如说:这里arr[0]其实可以看作一个一维数组,其元素从arr[0][0]到arr[0][9],arr[1]又可看作一维数组,其元素从arr[1][0]到arr[1][9],既然arr[0]、arr[1]……arr[9]这些都可看作一维数组,而一维数组的名称就代表数组的起始地址,所以arr[0]是第一行的起始地址,arr[1]是第二行的起始地址,arr[9]是最后一行的起始地址,因此a[i]就是第i-1行的地址,也是a[i][0]的地址,即a[i]=&a[i][0],而a[i]=*(a+i)仍然是成立的。
总结一下:二维数组中,a[i]代表第i-1行这个一维数组,因而a[i][j]的地址是a[i]+j,所以a[i][j]=*(a[i]+j)=*(*(a+i)+j)