数组指针是C语言中指向数组的指针,其本质是一个指针变量,存储的是整个数组的首地址。核心要点:数组指针的类型必须与所指向的数组类型完全匹配,定义格式为`类型 (指针名)[数组长度]`,例如`int (p)[5]`表示指向包含5个整型元素的一维数组的指针。 使用数组指针可以高效地遍历二维数组、传递多维数组给函数,以及实现动态内存管理。常见操作包括:通过`p = &array`获取数组地址,利用`(p)[i]`或`p[0][i]`访问元素,在函数参数中声明`void func(int (arr)[3])`以接收二维数组。注意区分数组指针与指针数组:数组指针指向数组整体,而指针数组是数组元素为指针的集合。正确使用数组指针能提升代码可读性和运行效率,避免数组退化为指针时的长度信息丢失问题。

【常见问题】
问题1:数组指针如何初始化指向一个二维数组?
回答1:数组指针初始化时,需将二维数组名(即数组首地址)赋值给数组指针,例如`int arr[2][3] = {{1,2,3},{4,5,6}}; int (p)[3] = arr;`,此时p指向包含3个int元素的二维数组的第一行。注意数组指针的类型必须与二维数组的列长度一致。
问题2:使用数组指针访问二维数组元素时,为什么`p[i][j]`和`(p)[i][j]`写法不同?
回答2:`p[i][j]`是标准的下标访问方式,因为p被定义为指向一维数组的指针,p[i]相当于第i行数组的首地址,`p[i][j]`直接取第i行第j列元素。而`(p)[i][j]`是错误的写法,正确的写法是`(p)[i]`表示第i行数组,再通过`(p)[i][j]`访问元素,但通常更简洁地使用`p[i][j]`。注意`(p)`是数组指针解引用后得到的一维数组,其下标用法与普通数组一致。
问题3:数组指针作为函数参数时,如何防止数组长度信息丢失?
回答3:将数组指针作为函数参数时,需要同时传递数组的行数和列数,例如`void func(int (p)[3], int rows)`,其中列数3在类型中固定,行数通过额外参数传入。这样函数内部就能正确遍历二维数组,避免因指针退化导致的行数信息丢失。若行数也需动态确定,则需使用指针的指针或一维数组模拟。


