c/c++指针数组和数组指针
数组指针只是一个指针变量,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
指针数组:array of pointers 也就是说数组中的每一个元素都是指针。
数组指针:a pointer to an array 也就是用指针指向一个数组。
下面用一个图来直观看两者区别:
定义区别:
1 int* a[4] 指针数组,表示:数组a中的元素都为int型指针, 元素表示:*a[i] *(a[i])是一样的,因为[]优先级高于*。 2 int (*a)[4] 数组指针, 表示:指向数组a的指针,元素表示:(*a)[i] 。 3 4 注意:在实际应用中,对于指针数组,我们经常这样使用: 5 typedef int* pInt; 6 pInt a[4]; 7 8 这跟上面指针数组定义所表达的意思是一样的,只不过采取了类型变换。
两者的用法大不相同,实例说明:
1 #include<iostream> 2 using std::cout; 3 using std::endl; 4 #define SIZE 5 5 class Test{ 6 private: 7 8 public: 9 10 }; 11 void main() 12 { 13 14 Test *test = new Test(); 15 16 int tempOne = 10; 17 int tempTwo = 20; 18 int tempThree = 30; 19 int tempFour = 40; 20 int tempFive = 50; 21 22 //指针数组的用法;数组中的每一个元素都是地址 23 int *arrayOne[SIZE]; //定义指针数组,数组中的每个元素都是地址,可是变量地址,结构体地址,数组地址等,不一一举例,以变量为例 24 25 cout << tempOne << endl; 26 arrayOne[0] = &tempOne; 27 arrayOne[1] = &tempTwo; 28 arrayOne[2] = &tempThree; 29 arrayOne[3] = &tempFour; 30 arrayOne[4] = &tempFive; 31 32 for (int i = 0; i < SIZE; i++) 33 { 34 cout << arrayOne[i] <<"\t"; 35 //输出的数组元素是地址,也就是tempOne,tempTwo,tempThree,tempFour,tempFive的地址 36 } 37 cout << endl; 38 for (int i = 0; i < SIZE; i++) 39 { 40 cout << *arrayOne[i] <<"\t"; 41 //输出的是指针地址对应的值,也就是tempOne,tempTwo,tempThree,tempFour,tempFive的值 42 } 43 cout << endl; 44 //数组指针的用法,不是真正的数组指针,指示模拟指针指向数组首地址 45 46 int array[SIZE] { 10, 20, 30, 40, 50 };//数组初始化 47 int *pointer; //定义一个指针,指向数组(指向数组首地址) //数组指针定义为 int (*pointer)[SIZE];用法笔者没用过不阐述 48 pointer = array; 49 50 cout << array << endl;//输出数组首地址 51 cout << pointer << endl; 52 for (int i = 0; i < SIZE; i++) 53 { 54 cout << *pointer << "\t"; 55 ++pointer; 56 //以下两种方法也可输出数组元素 57 //cout<<*(pointer+i)<<"\t"; 58 //cout<<pointer[i]<<"\t"; 59 } 60 cout << endl; 61 62 delete(test); 63 system("pause"); 64 }