指针数组 | 数组指针
- 指针数组(array of pointers):
一个数组,若其元素均为指针类型数据,称为指针数组。 也就是说,指针数组中每一个元素都相当于一个指针变量。其详细形式应该如下: *a[0], ...*a[n]. 每一个数组里面存储的是其指向的地址;一维指针数组的定义形式为:类型名 *数组名[数组长度]
例如:int *p[4],由于[]比*优先级更高,因此p先与[4]结合,形成p[4]的形式,这显然是数组形式。然后再与p前面的*结合,*表示此数组是指针类型的,每个数组元素都指向一个整型变量。本语句表示的含义就是说:p是一个指向二维数组的首指针,并且这个二维数组低维的维数为4。因此,编译器只是为p分配了一个指针的空间,在32位系统中,一般是4个字节。由于它不是一个数组,因此,编译器也不会为之分配数组空间。
- 数组指针(a pointer to an array):
一:数组指针:数组名本身就是一个指针,指向数组的首地址。注意这是声明定长数组时,其数组名指向的数组首地址是常量。而声明数组并使某个指针指向其值指向某个数组的地址(不一定是首地址),指针取值可以改变。
二:数组指针:是指向数组的一个指针,如int (*p)[10] 表示一个指向10个int元素的数组的一个指针。
指针数组如下处理就会很清楚:
typedef int* intPtr;
intPtr p[2];
同理,数组指针也可以作类似处理:
typedef int intArray2[2];
intArray2 * p;
例:
#include <iostream> using namespace std; int main() { int ar[4] = {1,2,3,4}; int *ptr1[4]; //指针数组 int (*ptr2)[4]; //数组指针 int i; ptr2 = &ar; //将ar的首地址给ptr2 for(i = 0; i < 4; ++i) //将ar中的元素给prt1 ptr1[i] = &ar[i]; for(i = 0; i < 4; ++i) cout << *ptr1[i] << " "; cout << endl; for(i = 0; i < 4; ++i) cout << (*ptr2)[i] << " "; cout << endl; return 0; }
注意:定义了数组指针,该指针指向这个数组的首地址,必须给指针指定一个地址,容易犯的错得就是,不给ptr2地址,直接用(*ptr2)[i]=ar[i]给数组ptr2中元素赋值,这时数组 指针不知道指向哪里,调试时可能没错,但运行时肯定出现问题,使用指针时要注意这个问题。但为什么ptr1就不用给他地址呢,ptr1的元素是指针,实际上for循环 内已经给数组ptr1中元素指定地址了。但若在for循环内写*ptr1[i]=ar[i],这同样会出问题。总之一句话,定义了指针一定要知道指针指向哪里,不然要悲剧。