一)、一维数组和指针
若有以下语句:
int *p,s[10],I;
p=s;
则s[i]的地址可用下面三种方法表示:
(1)&s[i] (2) s+i (3)p+i。
因此可以用s[i],*(s+i),*(p+i)来表示s[i]。由于s[i]可以用表达式*(s+i)来表示,同理*(p+i)也可以用p[i]来表示。事实上在c语言中,[]并不仅仅是用作表示数组元素的记号,而是一种运算符。因此当p指向数组s的首地址时,表示数组元素s[i]的表达式有下面四种方法:
(1)s[i] (2)*(s+i) (3) *(p+i) (4) p[i]
在这里s是数组名,是不可变的,而p是指向数组首地址的指针,其值是可变的。
二)、二维数组和指针
若有以下语句:
#define M 10
#define N 8
int a[M][N];
则二维数组元素的地址可以用下面5种方式表示:
(1)&a[i][j]
(2)a[i]+j
(3)*(a+i)+j
(4)&a[0][0]+i*N+j
(5)a[0]+i*N+j
相应的数组元素也有5种表达方式:
(1) a[i][j]
(2) *(a[i]+j)
(3) *(*(a+i)+j)
(4) *(&a[0][0]+i*N+j)
(5) (*(a+i))[j]