|
发表于 2004-5-26 20:58:00
|
显示全部楼层
Re: 指针问题值得一看
对于二维数组a[m][n]
a -> * * * ... *
a+1 -> * * * ... *
a+2 -> * * * ... *
...
a+i -> * * * ... *
a + i是指向一维数组的指针,它指向i行,它每加1便将跨越一行,即n个元素;
*(a + i)就变成指向元素的指针了,它每加1将只跨越一个元素,如*(a + i) + j指向a[j];
*(*(a + i) + j)便是a[j]了;
二维数组a实质上就是一维数组的数组,它的成员元素a是一个一维数组,C语言中用一维数组的首地址表示
这个一维数组,例如:字符串"palstone"实质上是一个char类型的一维数组,所以才会有这样的定义char *str
= "palstone";这样str便成为一个字符串,即一个一维数组,它表现为这个一维数组的地址,作为数组的地址,
str是一个抽象的概念,*str原则上不代表任何意义,但它却是字符"p"(printf("%c",*str);将显示字符p),原
因是*str和*(str+0)在语法上是等效的,从而str也是这个一维数组的首地址,但它们却具有不同的意义.同样,
既然a是一个一维数组,那么它必是一个一维数组的地址(如str),从而也是这个一维数组的首地址(如str+0).
同样的道理,a是一个二维数组,它的表现形式是这个二维数组的地址,同时也是这个二维数组的首地址,即这个
二维数组第0个元素的地址,亦即一维数组a[0]的地址,同样也是一维数组a[0]的首地址,即一维数组a[0]的第0
个元素a[0][0]的地址,从而**a = **(a + 0) = *(*(a + 0) + 0) = a[0][0].
有了这些概念后,便可以这样写了:
int a[2][3] = {{0,1,2},{3,4,5}}; /*a是一个二维数组,它有两个元素,每个元素都是一个具有3个元素的一维数组*/
int (*p)[3]; /*p是指向具有3个元素的一维数组的指针*/
p = a; /*这里的实质是p = a + 0;地址和首地址,抽象和具体的区别*/
|
|