数组和指针
指向二维数组的指针
设有二维数组定义如下:int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
该数组是由三个一维数组构成的(3行),它们是a[0]、a[1]和a[2]。
我们可以把a[0]看成是一个一维数组的名字,这个一维数组有4个元素,它们是a[0][0]、a[0][1]、a[0][2]和a[0][3]。也是就是说二维数组其实也是一个一维数组,其中每个元素又是一个一维数组。
a[0]就是其第0个元素(也就是第0行的首地址)、a[1]就是其第1个元素(也就是第1行的首地址)、a[2]就是其第2个元素(也就是第2行的首地址)。
第0行的首地址是&a[0],也可以写成a+0(也可以说是a[0][0]的地址)。同理,第一行的首地址是&a[1],也可以写成a+1(也可以说是a[1][0]的地址)。
a[0]+0就是a[0][0]的地址、a[0]+1就是a[0][1]的地址、a[0]+2就是a[0][2]的地址、a[0]+3就是a[0][3]的地址。
*(a[0]+0)和a[0][0]是一回事、*(a[0]+1)和a[0][1]是一回事。以此类推,*(a[i]+j)就是a[i][j]。而a[i]和*(a+i)是等价的,所以我们得到,*(a+i)+j就是a[i][j]的地址,*(*(a+i)+j)就是a[i][j]。
指向“一行变量”的指针
如果有定义int *p; 我们称p为指向“一个变量”的指针。
我们也可以定义一个指向“一行变量”的指针变量,指向“一行变量”的指针定义的一般形式为:
类型说明符 (*指针变量名)[一行元素的长度];
例如: int (*p)[4];
含义为:定义了一个指针变量,该指针变量指向一整行变量(整行一维数组),这一行变量固定有4个元素。