C++指针类型的基本理论和使用方式-学习记录

一、指针简概

(一)指针定义

        指针(pointer)是“指向(point to)”另外一种类型的复合类型。与引用类似,指针也实现了对其他对象的间接访问。然而指针与引用相比又有很多不同点。其一,指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。其二,指针无须在定义时赋初值。和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值(通常为避免“无效指针/野指针”的出现,会将指针初始化为空值(如nullptr、NULL、0)[1]

补充说明:

1. 指针存放某个对象的地址,想要获取该地址,需要使用取地址符(操作符&);

2. 如果指针指向了一个对象,则允许使用解引用符(操作符*)来访问该对象。

(二)空类型指针(Void *ptr)

       空类型指针(泛型指针void*)是C++提供的一种特殊的指针类型,空类型指针可以指向任意非常量数据类型,空类型指针表明相关的值是个地址,但该地址的对象类型未知。空类型指针常被用于“对象的确切类型未知”“在特定环境下对象的类型会发生变化”或者“需要持有地址值(比较多个地址)”的情况。

注意事项:

1. 不能够直接操作空类型指针所指向的对象,只能传送该地址值或将它与其他地址值作比较。由于没有类型信息可用来指导编译器解释底层的位模式,void*类型指针不能直接被解除引用(若需要操作空类型指针所指向的对象,必须显式转换为对应类型指针);

2. 在显式转换(强制类型转换,即包含static_cast、dynamic_cast、const_cast和reinterpret_cast强制类型转换操作符)中,任何非const数据类型的指针都可以被赋值给void*类型的指针(const数据类型的指针对应const void*)。相反,void*类型的指针必须先被转换成某种特定类型的指针,才能够被赋值给某种特定类型的指针。

(三)函数指针

        函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。

bool  (*ptr)(const string &,const string &) = nullptr;

        上述函数指针初始化示例中,ptr为函数指针,该函数指针类型为bool (*)(const string &,const string &)。ptr指向一个函数,该函数的参数是两个const string的引用,返回值是bool类型。

函数指针使用基本说明(p222):

1. 函数名作为一个值使用时,该函数自动地转换为指针;

2. 可以直接使用指向函数的指针来调用该函数,无须提前解引用指针;

3. 使用重载函数时,上下文必须清晰地界定到底应该选用哪个函数(即返回类型、形参列表精准匹配);

4. 在函数指针作为函数形参的情况下,函数类型实际上作为指针使用(编译器自动转换);在函数返回类型是指向函数的指针时,必须把返回类型写成指针形式,编译器不会自动地将函数返回类型当成对应的指针类型处理;

5. 明确函数类型和函数指针类型的区别,int(int*,int)是函数类型,int(*)(int*,int)是函数指针类型

        ***简化使用函数指针代码的方法[1][3]

        当函数指针作为函数的形参时,函数的声明会因为直接使用函数指针类型而显得冗长且繁琐。然而,使用类型别名和decltype能简化使用了函数指针的代码,简化示例如下:

bool lengthCompare(const string &,const string &);    // 函数原型

// Func和Func2是函数类型(下述两行代码等效)

typedef bool Func(const string &,const string &);

typedef decltype(lengthCompare) Func2;

// FuncP和FuncP2是指向函数的指针(下述两行代码等效)

typedef bool (*FuncP)(const string &,const string &);

typedef decltype(lengthCompare) *FuncP2;

二、基于动态链接库(DLL)的函数调用方式

        在C++高级编程语言中,可以使用LoadLibrary和GetProcAddress函数进行动态链接库内函数的动态加载使用。

// 1.导入头文件
#include <windows.h>
#include <iostream>// 2.使用LoadLibrary函数加载DLL文件
HINSTANCE hDll = LoadLibrary("DLL文件存储地址");
if (hDll == NULL)
{std::cout<< "DLL file cannot be opened!" <<endl;
}// 3.加载DLL成功后,使用GetProcAddress函数来获取DLL中函数的地址
// 假设DLL中有一个名为ExampleFunction的函数,其原型为int ExampleFunction(int arg1,int arg2)
typedef int(*PFN_EXAMPLE_FUNCTION)(int, int);
PFN_EXAMPLE_FUNCTION pfn = (PFN_EXAMPLE_FUNCTION)GetProcAddress(hDll,"ExampleFunction");  
if (pFunction == NULL)
{std::cout<< "DLL file cant be open!" <<endl;FreeLibrary(hDll);
}// 通过函数指针来调用函数
int result = pfn(1, 2);
FreeLibrary(hDll);

参考资料:

[1] C++ Primer中文版:第5版 /(美)李普曼(Lippman,S.B.),(美)拉乔伊(Lajoie,J.),(美)默(Moo,B.E.)著;王刚,杨巨峰译. —北京:电子工业出版社,2013.9.

[2] C++数据类型以及函数设计学习记录_c++数据类型函数-CSDN博客

[3] C++处理类型方法-学习记录-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频转码对画质有影响吗?视频融合平台EasyCVR支持哪些转码格式?

视频转码过程是将视频文件从一种编码格式转换为另一种格式的过程&#xff0c;这一过程在现代数字媒体中扮演着至关重要的角色。众所周知&#xff0c;视频转码不仅仅是简单的格式转换&#xff0c;它涉及多个关键参数的改变&#xff0c;例如视频编码格式、比特率、分辨率以及帧率…

微信小程序防止重复点击事件

直接写在app.wpy里面&#xff0c;全局可以调用 // 防止重复点击事件preventActive(fn) {const self this;if (this.globalData.PageActive) {this.globalData.PageActive false;if (fn) fn();setTimeout(() > {self.globalData.PageActive true;}, 3000); //设置该时间内…

STM32-WWDG/IWDG看门狗

WWDG/IWDG一旦开启不能关闭&#xff0c;可通过选项字节在上电时启动硬件看门狗&#xff0c;看门狗计数只能写入不能读取。看门狗启用时&#xff0c;T6bit必须置1&#xff0c;防止立即重置。 一、原理 独立看门狗-超时复位 窗口看门狗-喂狗&#xff08;重置计数器&#xff0c;…

【计算机网络】什么是AC和AP?

在现代的无线网络中&#xff0c;AC&#xff08;Access Controller&#xff0c;接入控制器&#xff09;和AP&#xff08;Access Point&#xff0c;无线接入点&#xff09;是两个至关重要的设备&#xff0c;它们在网络的管理、连接和优化中扮演着重要角色。理解它们的功能和区别&…

C++初阶—CC++内存管理

第一章&#xff1a;C/C内存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(si…

排序的本质、数据类型及算法选择

排序的本质、数据类型及算法选择 一、排序的本质二、排序的数据类型三、排序算法的选择依据 前两天老金写了篇 “十大排序简介”&#xff0c;有点意犹未尽&#xff0c;这一回老金想把排序连根拔起&#xff0c;从排序的本质说道说道。 一、排序的本质 从字面上理解&#xff0c…

arcgisPro加载天地图(CGCS2000)影像

1、注册天地图账号&#xff1b; 2、申请key&#xff1b; 3、添加WMTS服务器。 这里已经办好了前两步&#xff0c;下面详细介绍最后一步。 添加WMTS服务器。 在天地图网站&#xff0c;找到如下页面&#xff0c; 复制网址&#xff0c;如&#xff1a;http://t0.tianditu.gov.cn…

【测试】持续集成CI/CD

近期更新完毕&#xff0c;建议关注收藏点赞&#xff5e; 目录 概括gitJenkinspostman集成jenkins代码集成jenkins 概括 CI/CD stands for Continuous Integration and Continuous Deployment 定义 团队成果持续集成到公共平台。一天可以集成1次or多次 本地代码管理 git 远程代…

python基础和redis

1. Map函数 2. filter函数 numbers generate_numbers() filtered_numbers filter(lambda x: x % 2 0, numbers) for _ in range(5):print(next(filtered_numbers)) # 输出: 0 2 4 6 83. filter map 和 reduce 4. picking and unpicking 5. python 没有函数的重载&#xff0…

Three.js 性能优化:打造流畅高效的3D应用

文章目录 前言一、减少几何体复杂度&#xff08;Reduce Geometry Complexity&#xff09;二、合并几何体&#xff08;Merge Geometries&#xff09;三、使用缓冲区几何体&#xff08;Use BufferGeometries&#xff09;四、纹理压缩与管理&#xff08;Texture Compression and M…

人工智能及深度学习的一些题目(常错)

1、【判断题】HMM的状态序列即不能直接获得&#xff0c;也不能通过观测序列获得。 错误 HMM可以通过观测序列获得状态序列 2、【单选题】当设计一个全连接网络完成INIST字符识别实验时&#xff0c;初始网络设计为两层隐藏层&#xff0c;每层分别有874个和128个神经元 3、【单…

20250110_ PyTorch中的张量操作

文章目录 前言1、torch.cat 函数2、索引、维度扩展和张量的广播3、切片操作3.1、 encoded_first_node3.2、probs 4、长难代码分析4.1、selected4.1.1、multinomial(1)工作原理&#xff1a; 总结 前言 1、torch.cat 函数 torch.cat 函数将两个张量拼接起来&#xff0c;具体地是…

【再谈设计模式】模板方法模式 - 算法骨架的构建者

一、引言 在软件工程、软件开发过程中&#xff0c;我们经常会遇到一些算法或者业务逻辑具有固定的流程步骤&#xff0c;但其中个别步骤的实现可能会因具体情况而有所不同的情况。模板方法设计模式&#xff08;Template Method Design Pattern&#xff09;就为解决这类问题提供了…

安卓app抓包总结(精)

前言 这里简单记录一下相关抓包工具证书的安装 burp证书安装 安装证书到移动设备(安卓7以后必须上传到设备系统根证书上) 导出证书 openssl x509 -inform DER -in cacert.der -out cacert.pem 转换格式 openssl x509 -inform PEM -subject_hash_old -in cacert.pem …

【pycharm发现找不到python打包工具,且无法下载】

发现找不到python打包工具,且无法下载 解决方法&#xff1a; 第一步&#xff1a;安装distutils&#xff0c;在CMD命令行输入&#xff1a; python -m ensurepip --default-pip第二步&#xff1a;检查和安装setuptools和wheel&#xff1a; python -m pip install --upgrade …

2025年VGC大众汽车科技社招入职测评综合能力英语口语SHL历年真题汇总、考情分析

早在1978年&#xff0c;大众汽车集团就开始了与中国的联系。1984年&#xff0c;集团在华的第一家合资企业—上汽大众汽车有限公司奠基成立&#xff1b;1991年&#xff0c;一汽-大众汽车有限公司成立&#xff1b;2017年&#xff0c;大众汽车&#xff08;安徽&#xff09;有限公司…

[大模型]本地离线运行openwebui+ollama容器化部署

本地离线运行Openweb-ui ollama容器化部署 说明安装internet操作内网操作问题线程启动错误最终命令总结说明 最近公司有一个在内网部署一个离线大模型的需求,网络是离线状态,服务器有A100GPU,一开始是想折腾开源chatGML4大模型,因为使用过gml3,所以想着部署gml4应该不难。…

【NLP 18、新词发现和TF·IDF】

目录 一、新词发现 1.新词发现的衡量标准 ① 内部稳固 ② 外部多变 2.示例 ① 初始化类 NewWordDetect ② 加载语料信息&#xff0c;并进行统计 ③ 统计指定长度的词频及其左右邻居字符词频 ④ 计算熵 ⑤ 计算左右熵 ​编辑 ⑥ 统计词长总数 ⑦ 计算互信息 ⑧ 计算每个词…

30天开发操作系统 第 12 天 -- 定时器 v1.0

前言 定时器(Timer)对于操作系统非常重要。它在原理上却很简单&#xff0c;只是每隔一段时间(比如0.01秒)就发送一个中断信号给CPU。幸亏有了定时器&#xff0c;CPU才不用辛苦地去计量时间。……如果没有定时器会怎么样呢?让我们想象一下吧。 假如CPU看不到定时器而仍想计量时…

mongodb清理删除历史数据

批量清理mongodb历史数据 清理程序的原来 目前项目组上很多平台上线历史数据积压&#xff0c;导致入库查询数据缓慢&#xff0c;历史数据有些已经归档&#xff0c;进行历史数据清理删除。 之前临时写shell脚本&#xff0c;太简陋&#xff0c;重新使用Python进行改造&#xff0c…