多维数组和指针
int a[3][4] ={{},{},{}};
二维数组a是由3个一维数组组成的;
从二维数组角度看,a代表二维数组首元素的地址,此元素不是一个简单的整型元素,而是4个整型元素所组成的一维数组;
a代表首行的首地址 a+1代表第一行的首地址
a[0]、a[1]、a[2]为一位数组名
a[0]代表一维数组a[0]中第0列元素的地址,即&a[0][0];a[1]的值是&a[1][0]; a[2]的值是&a[2][0];
a[0]+0=&a[0][0]=*(a+0)+0;
a[0]+1=&a[0][1]=*(a+0)+1;
a[0]+2=&a[0][2]=*(a+0)+2;
a[0]+3=&a[0][2]=*(a+0)+3;
a[i]从形式上看是a数组中序号为i的元素。如果a是一维数组名,则a[i]代表a数组中序号为i的元素所占的内存单元的内容,a[i]是有物理地址的,是占内存单元的;
若a是二维数组名,则a[i]代表一维数组名,他只是一个地址,并不代表某一元素的值(如同一维数组名只是一个指针常量一样)。a、a+i、a[i]、*(a+i)、*(a+i)+j、a[i]+j都是地址,而*(a[i]+j)和*(*(a+i)+j)是二维数组元素a[i][j]值
a 二维数组名,指向一维数组a[0],即0行首地址
a[0],*(a+0),*a 0行0列元素的地址
a+1,&a[1] 1行首地址
a[1],*(a+1) 1行0列元素a[1][0]的地址
a[1]+2,*(a+1)+2,&a[1][2] 1行2列元素a[1][2]的地址
*(a[1]+2)、*(*(a+1)+2)、a[1][2] 1行2列元素a[1][2]的值
a+1和*(a+1)地址都是一样的,为何?
首先a+1是二维数组a中序号为1的行的首地址,而*(a+1)并不是a+1单元的内容,因为a+1并不是一个变量的存储单元,*(a+1)也就是a[1],而a[1]是一维数组名,所以也是地址,他指向a[1][0]
a+1与a[0]+1是不同的
a+1是序号为1 的行的首地址,a+1指向序号为1的行,而*(a+1)或a[1]或a[1]+0都是指向1行0列元素,二者虽地址相同,但含义不同。
a、a[0]的值虽然相同,但是由于指针类型不同(a是指向一维数组,a[0]指向a[0][0]元素),因此对指针的加1运算,得到的结果也不同
二维数组名(如a)指向行,因此a+1中的“1”代表一行中全部元素所占的字节数。
一维数组名(如a[0]、a[1])是指向列元素的,a[0]+1中的“1”代表一个元素所占的字节数。
在指向行的指针前面加一个*,就转换为指向列的指针。
反之,在指向列的指针前面加&,就成为指向行的指针
在二维数组中,不要把&a[i]理解为a[i]单元的物理地址,因为并不存在a[i]这样一个实际变量,*(a+i)只是a[i]另一种表现形式,不要简单的认为*(a+i)是“a+i所指单元的内容”。在一维数组中a+i所指的是一个数组元素的存储单元,在该单元中有具体值,而对二维数组,a+i不是指向具体存储单元而是指向行,在二维数组中,a+i、a[i]、*(a+i)、&a[i]、&a[i][0]的值相等,即他们表示同一个地址。
新闻热点
疑难解答