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

发布于 2022-09-01 23:16:03 字数 38 浏览 17 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

☆獨立☆ 2022-09-08 23:16:03

要理解二级指针的用法,必须先从根本上理解它的含义。其实含义很简单,二级指针即指针的指针。比如说,内存地址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对象。

夜无邪 2022-09-08 23:16:03

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

甜妞爱困 2022-09-08 23:16:03

链表头,链表尾

国产ˉ祖宗 2022-09-08 23:16:03

所有的二维数组

放飞的风筝 2022-09-08 23:16:03

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

眼眸 2022-09-08 23:16:03

我见过四级指针

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文