.
数组指针与指针数组
数组指针是指针,意为指向数组的指针;
指针数组是数组,意为数组内部存储着指针的数组。
数组指针
数组指针具有如下特性1:
- 数组指针用于指向一个数组;
- 数组名是数组首元素的起始地址,但不是数组的起始地址,通过取地址符
&
作用域数组名可以得到数组的起始地址; - 可以通过数组类型定义数组指针如:
ArrayType *pointer
,也可以直接定义type (*pointer)[n]
。
下面的代码创建了两个指向数组起始地址的指针p1
,p2
。
//创建数组
int a[3] = {4, 9, 2};
//type (*pointer)方法定义数组指针
int (*p1)[3];
p1 = &a;
//ArrayType* pointer方法定义数组指针
typedef int(AINT3)[3];
AINT3* p2 = &a;
指针数组
指针数据具有如下特性:
- 指针数组是一个普通的数组,数组中的每个元素都是指针;
- 指针数组的定义为:type *pArray[n];
下面的代码创建了一个数组,数组内部存储的变量为A *
类型。
//定义类A
class A{
public:
A(){}
A(int a1, int a2){
_a1 = a1;
_a2 = a2;
}
public:
int _a1;
int _a2;
};
//创建存储A*类型变量的大小为3的数组arr
A* pArr[3];
pArr[0] = new A(0,1);
pArr[1] = new A(1,2);
pArr[2] = new A(2,3);
.
.
二级指针
二级指针即为指向指针的指针。
二级指针的特性
- 指针变量在内存中占用一定的空间;
- 可以定义指针来保存指针变量的地址值;
- 为什么需要指向指针的指针?
指针本质上也是变量,对于指针同样也存在传值调用和传址调用。
指向指针数组的数组指针与二级指针
指向指针数组的数组指针定义形式为:
//沿用上文定义的类A
A* pArr[3];
pArr[0] = new A(0,1);
pArr[1] = new A(1,2);
pArr[2] = new A(2,3);
A* (*pa)[3];
pa = &pArr;
其使用方法与数组指针并无区别,首先用*pa
取得pArr
的地址,用*(*pa)
取得pArr[0]
的地址,随后即可用->
操作符访问类A
中的成员变量。
用二级指针也可以得到相同的效果:
A** pb = pArr;
使用时用*pb
即可取得pArr[0]
的地址。
有关二维数组与数组指针、二级指针方面的混合应用可参考《指针 中 数组指针,指针数组,数组传参,指针传参》一文。2
测试代码
#include <iostream>
using namespace std;
typedef int(AINT3)[3];
class A{
public:
A(){}
A(int a1, int a2){
_a1 = a1;
_a2 = a2;
}
public:
int _a1;
int _a2;
};
int main()
{
int a[3] = {4, 9, 2};
int (*p1)[3];
p1 = &a;
AINT3* p2 = &a;
cout <<"---------a[3]---------"<<endl;
cout <<"&a: "<< &a << endl;
cout <<"*p1: " <<*p1 << endl;
cout <<"*p2: " <<*p2 << endl;
cout <<"----------------------"<<endl;
A* pArr[3];
pArr[0] = new A(0,1);
pArr[1] = new A(1,2);
pArr[2] = new A(2,3);
A* (*pa)[3];
pa = &pArr;
A** pb = pArr;
cout <<"---------pArr---------"<<endl;
cout <<"&arr: "<< &pArr << endl;
cout <<"arr[0]: "<< pArr[0] << endl;
cout <<"*pa: "<< *pa << endl;
cout <<"**pa: "<< **pa << endl;
cout <<"pb: "<< pb <<endl;
cout << (**pa)->_a1 << endl;
cout << (*(pb+2))->_a1 <<endl;
cout <<"----------------------"<<endl;
return 0;
}
输出结果如下:
------------a[3]------------
&a: 0x7ffc642476f4
*p1: 0x7ffc642476f4
*p2: 0x7ffc642476f4
-----------------------------
------------pArr-----------
&arr: 0x7ffc642476d0
arr[0]: 0x23d7c30
*pa: 0x7ffc642476d0
**pa: 0x23d7c30
pb: 0x7ffc642476d0
0
2
-------------------------------