指针数组和数组指针的区别


在编程中,“数组指针”与“指针数组”是两种截然不同的概念表述。

1)数组的指针:这指的是一个指针,具体地说,是一个指向数组的指针。它在内存中占据着指针的存储空间。通过它,我们可以访问到某个数组的起始地址。

2)指针的数组:这是一个由多个指针组成的数组。每个元素都是一个指针,它们在内存中占据着连续的存储空间。

根据运算符的优先级顺序:函数调用()优先级高于数组下标[],再高于指针解引,可以如此理解:

1)int (p)[n]:这里()的优先级最高,首先表明p是一个指针。它指向的是一个一维整型数组,该数组的长度为n。换句话说,每当前进到p+1时,p会跨越n个整型数据的长度。我们称这种指针为行指针,即指向一维数组的指针。

2)int p[n]:在这里,[]的优先级高于。它先与p结合成一个数组,然后由int说明这个数组里的每个元素都是整型指针。需要注意的是,执行p+1的操作是错误的,同样,直接赋值p=a也是错误的。因为p代表的是这个指针数组,它是由多个未知的表示组成,只有p[0]、p[1]、p[2]...p[n-1]这些元素才是具体的指针变量,可以用来存放变量地址。而p则表示指针数组的第一个元素的值,即某个地址的值。

例如,定义int (p2)[5],意味着我们定义了一个指针p2,它指向一个包含5个int类型数据的匿名数组。显然,这是一个数组指针。

再如,对于语句int p1[5],[]的优先级高于,所以这定义了一个包含5个元素的数组p1,每个元素都是指向int类型数据的指针。它是一个指针数组。

为了更好地理解这两种概念,我们可以通过指向一维和二维数组的例子来进一步阐释。以一维数组为例,我们可以这样理解:存在一个数组,我们通过一个指针来访问它的起始地址;而以二维数组为例,我们可以想象一个由多个一维数组组成的结构,每个一维数组都有自己的起始地址,这些起始地址被存储在一个指针数组中。

一个是通过一个指针来访问整个数组(数组的指针),另一个是通过一个包含多个指针的数组来分别访问各个子数组或数据(指针的数组)。这两种方式在编程中各有其用途和重要性。

图例说明:

图1展示了数组指针的内存分配情况;

图2则展示了指针数组的内存分配情况。