指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用方法上,多维数组的指针比一维数组的指针要复杂一些。
1. 多维数组元素的地址

a代表第0行首地址,a+1代表第1行首地址,a+2代表第2行首地址。行指针每加1,走一行。
a+i代表行号为i的行首地址(按行变化),*(a+i)代表什么?*(a+i)相当于a[i]。
a[0]代表a[0][0]的地址,a[0]+1代表a[0][1]的地址,a[0]+2代表a[0][2]的地址,a[0]+3代表a[0][3]的地址,列指针每加1,走一列。
a[i]+j代表谁的地址? 代表a[i][j]的地址
*(a[i]+j)代表什么? 代表元素a[i][j]
*(*(a+i)+j)代表什么? 与*(a[i]+j)等价,代表元素a[i][j]
2.指向数组元素的指针变量
二维数组的每一个元素a[i][j]都有一个指针(地址),它就是&a[i][j]。因此指针变量可以指向二位数组的任何一个元素 。

对二维数组元素的引用有两种方法:
① 下标法,如a[i][j]或p[k]形式。
② 指针法,如*(*(a+i)+j)或*(p+k)形式。
例:有一个3×4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值。
解题思路:
(1)二维数组的元素是整型的,它相当于整型变量,可以用int*型指针变量指向它
(2)二维数组的元素在内存中是按行顺序存放的,即存放完序号为0的行中的全部元素后,接着存放序号为1的行中的全部元素,依此类推。
(3)因此可以用一个指向整型元素的指针变量,依次指向各个元素
参考代码:
#include <stdio.h>
void main( )
{int a[3][4]= {1,2,3,4,8,7,6,5,4,1,9,6};
int *p;
p=&a[0][0];
printf("output :\n");
while (p<=&a[2][3])
{ printf("%3d", *p++);
if ((p-&a[0][0])%4==0)
printf("\n");
}
}
3.指向由m个元素组成的一维数组的指针变量
前面的例题中定义的指针变量p指向一个整型数组元素,p+1指向下一个元素。还可定义行指针,使p不指向一个数组元素,而指向一个包含m个元素的一维数组;p先指向a[0],p+1指向a[1]。
定义形式:int (*p)[4] ;
*表示p是指针变量, 且p所指向的对象是有4个整型元素的数组,p+1的值比p的值增加了4*4个字节(即一维数组的长度)。
观察以下程序,理解程序的功能。
#include <stdio.h>
int main()
{int a[3][4]={1,3,5,7,9,11,13,15, 17,19,21,23};
int (*p)[4],i,j;
p=a;
printf(“enter row and colum:");
scanf(“%d,%d”,&i,&j);
printf(“a[%d,%d]=%d\n”, i,j,*(*(p+i)+j));
return 0;
}
若输入1,2,结果?

