在二维数组中,行指针是指向一维数组的指针变量.
不是
首先数组名都是数组地址的指针常量。
假设int a[3]这样一个数组,a是普通常量指针,即一维数组指针,其地址类型是 int * 。因此要定义一个指向这个数组的指针p,则其格式为 : int *p;然后就可以赋值了:p=a;(类型一致)。
再假设int b[3][4]这样一个二维数组,b是行地址常量指针,其地址类型是 int (*)[4] 。因此要定义一个指向这个数组的指针ptr,则其格式为 : int (*ptr)[4]; 然后就也可以赋值了:ptr=b;(类型一致)
这里容易混淆的是,看上去一行数据就是一维数组,所以很多人会将二维数组的一行数据与一维数组的数据混为一谈,其实有差异的,差异在于:行宽不同
我们可以看出一维数组的地址类型为 (type *),没有下标(行宽、数组长度、元素个数),只有定义数组的时候需要给予下标,或者省略下标时必须初始化{1,2,3,4.....},编译器会自动获得下标并分配内存。因此指向一维数组指针也不带下标的,这也就是指针灵活也不安全的原因(数组边界检查及宽度控制完全交给程序员)。然而二维数组中的行宽是确定,也是必须的,因此二维数组的行宽必须明确,因此其指针定义必须包含行宽信息。
type (*)[n] 是行指针类型格式,方括号内的n就是指示行宽,因此行指针不是简单的一维数组指针,而是被限定宽度的一维数组指针,这就是区别。
归纳一下
一维数组指针定义格式:type *p
二维数组行指针定义格式:type (*p)[n]
另外 一维数组指针加一,是递增一个type宽度,二维数组行指针加一,是递增 type宽度*行宽,也就是数据宽度乘一行的元素个数,单位都是字节。