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

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

阅读 10.8k
6 个回答

要理解二级指针的用法,必须先从根本上理解它的含义。其实含义很简单,二级指针即指针的指针。比如说,内存地址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++里,传引用或者传指针都能达到这个效果。这里用传指针的方法,如下图所示:
图片描述

&pShape,即ppShape,是指向pShape所在地址的指针,也就是一个二级指针。这样就可以在CreateShape内部为pShape赋值了:

*ppShape = new Shape; 

于是,pShape真正指向了堆上的Shape对象。

main函数第二个参数
传入参数列表

链表头,链表尾

所有的二维数组

动态申请二维数组以及其相关操作,其他情况貌似很少使用

新手上路,请多包涵

我见过四级指针

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进