开发者社区> 问答> 正文

C语言中,二级指针的用处,必要性和经常使用在的地方,求大神指导

C语言中,二级指针的用处,必要性和经常使用在的地方,求大神指导

展开
收起
a123456678 2016-06-12 10:33:04 2527 0
1 条回答
写回答
取消 提交回答
  • 要理解二级指针的用法,必须先从根本上理解它的含义。其实含义很简单,二级指针即指针的指针。比如说,内存地址A中存放了一个地址,那么A就是一个指针;内存地址B中恰好存放了内存地址A,那么B就是一个指针的指针,即二级指针。

    根据这个思路,说两种最常见的二级指针用法。

    1.动态申请二维数组。

    C++中动态申请一维数组,一般形式为

    T *arr_t = new T[N];
    也就是说,在堆上分配出N*sizeof(T)的空间,并让arr_t指向这块空间的起始地址。同理,动态申请二维数组的一般形式为:

    T *arr_t = new T[N];
    for (int i = 0; i < N; ++i) {
    arr_t[i] = new T[M];
    }
    这里的arr_t指向的是一个指针数组的起始位置。也就是说,先在堆上分配一块空间,这块空间里面存的全都是指针。然后,在for循环内,对于每个指针,都要在堆上重新开辟一块大小为M*sizeof(T)的空间,这块空间才真正存储我们想要的数据,然后让指针指向这块空间的起始地址。而那块叫做“arr_t”的内存里,实际上存储的是指针数组的起始位置。

    2.用于返回参数。

    参考一个MSDN上的例子,假设有一个接口叫IDrawable,同时,有一个叫做Shape的类实现了这个接口。再假设有个图形库里面有这样一个函数:

    HRESULT CreateShape(IDrawable** ppShape);
    这个函数用于创建一个Shape对象。现在问题来了,创建好的Shape对象总要返回吧?而这个函数又恰好需要返回一个表示成功或失败的、类型为HRESULT的代码,那么创建好的Shape让谁返回呢?显然,需要通过参数ppShape来返回。这个函数的使用场景如下:

    IDrawable *pShape;

    HRESULT hr = CreateShape(&pShape);
    if (SUCCEEDED(hr))
    {

    // Use the Shape object.

    }
    else
    {

    // An error occurred.

    }
    显然,pShape的作用就是指向堆上的某块空间,这个空间里存着一个Shape类型的对象。也就是说,我们之所以要把pShape传给函数CreateShape,就是想改变pShape的当前值(当前值可能为NULL,或者指向其他某个不确定的内存位置),让pShape真正指向堆上的Shape对象。于是,问题转化成“怎样真正改变传入函数的参数值”的问题。显然,在C++里,传引用或者传指针都能达到这个效果。这里用传指针的方法,如下图所示:
    screenshot

    2019-07-17 19:33:22
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
数据+算法定义新世界 立即下载
当泛型遇上协议 立即下载
Go语言路上踩过的坑 立即下载