当前位置:网站首页>指针与指针的指针
指针与指针的指针
2022-06-22 03:16:00 【春夜喜雨】
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
1. 引言
指针与指针的指针,本质上来看,两者都是存储地址,体现在语言特性上来看的话,一个是一层指针,一个是二层指针。
2. 指针与指针的指针
void* p;
void** pp = &p;
指针 与 指针的指针;
2. 1. 内部来看
都是指针,存储了一个地址;
不同点在于一个存普通变量地址,一个存指针变量地址;
但从内存角度看的话,都是一个变量地址值;
2. 2. 编译器的角度来看
对它的检查有所不同;
两者对编译器检查来说是不同的,指针可以一次重定向,指针的指针可以两次重定向;
指针可以指向一个地址;
指针的指针可以指向一个指针的地址;
指针和指针的指针不能替换使用,但是强制转换也是可以的。
例如:
void* p = nullptr;
void** pp = &p;
void* pc = (void*)(pp);
void** ppc = (void**) (p);
3. 为什么要有指针的指针?
我个人觉得,可能主要是标识与编译器检查的需要吧;
要不从存储使用角度来看,两者都是存地址,通过*重定向指向的地址位置的变量,存储功能都是一致的;
指针的指针的使用场景:
- 满足编译器识别需要的场景
- 满足函数值传递需要的场景
3.1 满足编译器识别需要场景
例如:
下面这个场景,pp想存储一个变量的地址,从而指向这个变量,而这个变量本身是一个指针;
void *p;
void** pp = &p;
例如:
下面这个场景,pp想指向一个数组,而这个数组是一个指针数组;
void* parray[] = {nullptr, nullptr};
void** pp = parray;
3.2 满足函数值传递需要的场景
例如:
我们希望变量在函数中赋值,通常传递变量地址过去即可,但是这个变量本身是一个指针p;
单层指针传递过去的是变量p的值(也即p的指向),双层指针才能传递过去p的地址;
void *p = nullptr;
getResource(&p);
void getResource(void** p){
*p = new xxx(...);
}
—个人理解,仅供参考
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
边栏推荐
- golang并发编程之runtime包
- What is an SSL certificate and what are the benefits of having an SSL certificate?
- [percona toolkit] series of Pt table checksum and Pt table sync data verification and repair artifacts
- On the auto increment of int type primary key in MySQL
- 图书馆管理系统(PHP期末报告)
- The most popular massive Alibaba cloud disk resource sharing
- [nvme2.0b 12] NVM capacity model
- Runtime package for golang concurrent programming
- Wxml template syntax, wxss template style, global configuration, page configuration, and network data request
- 装饰器《二》 property - 简答逻辑
猜你喜欢

Splunk: Auto load Balanced TCP Output issue

调度功能:splunk-operator-controller-manager

Figure data platform solution: cluster deployment

【NVMe2.0b 5】NVM Subsystem

On the auto increment of int type primary key in MySQL

Typora + picGo 配置图床实现图片自动上传

华硕重装系统键盘灯失效 =>重装ATK驱动

Selenium entry level project - Doudou quiz

618来袭,当贝X3和极米H3S怎么选?带你全方位深度解析

服装实体店如何突破销售困境
随机推荐
AtCoder Regular Contest 142
360edr planing
[nvme2.0b 8] nvme queue arbitration mechanism
Atcoder beginer contest 252 (Dijkstra, reverse thinking)
【NVMe2.0b 8】NVMe 队列仲裁机制
[pwn basics]pwntools learning
[nvme2.0b 10] controller shutdown and NVM subsystem shutdown
EFCore中的主键
TX2 attaching SD card, jtop
Wechat applet onpagescroll is invalid
作为接口的模板
vim常用命令
tail的用法
Project management software development project management
Classification of traffic signs
Kubernetes介绍和使用
Installing and using mysql8 under Linux (Reprint)
Opencv installation (x86/tx2 cuda/ shared library)
golang并发编程之select
Redis6.0 new features (Part 2)