【C++】数组指针、指针数组与二级指针


.

数组指针与指针数组

数组指针是指针,意为指向数组的指针;
指针数组是数组,意为数组内部存储着指针的数组。

数组指针

数组指针具有如下特性1

  1. 数组指针用于指向一个数组;
  2. 数组名是数组首元素的起始地址,但不是数组的起始地址,通过取地址符&作用域数组名可以得到数组的起始地址;
  3. 可以通过数组类型定义数组指针如:ArrayType *pointer,也可以直接定义type (*pointer)[n]

下面的代码创建了两个指向数组起始地址的指针p1p2

//创建数组
int a[3] = {4, 9, 2};

//type (*pointer)方法定义数组指针
int (*p1)[3];
p1 = &a;

//ArrayType* pointer方法定义数组指针
typedef int(AINT3)[3];
AINT3* p2 = &a;

指针数组

指针数据具有如下特性:

  1. 指针数组是一个普通的数组,数组中的每个元素都是指针;
  2. 指针数组的定义为: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);

.
.

二级指针

二级指针即为指向指针的指针。

二级指针的特性

  1. 指针变量在内存中占用一定的空间;
  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
-------------------------------


  1. 指针数组和数组指针 ↩︎

  2. 指针 中 数组指针,指针数组,数组传参,指针传参 ↩︎

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值