c++ 指针的初始化

为指针正确赋值可以避免未定义行为(如野指针)。指针可以指向变量、数组、另一个指针(多级指针)、函数等。

指针的初始化可以在声明时进行,也可以在声明之后进行。

初始化为 nullptr

从 C++11 开始,建议初始化未指向任何具体对象的指针为 nullptr。这是一个特殊的值,代表该指针没有指向任何内存地址。在 C++11 之前,NULL 被用来表示空指针。它通常被定义为 0 或者 ((void*)0)。
不过,使用 nullptr 可以提高代码的表达能力,因为 nullptr 的类型是 nullptr_t,而 NULL 实际上是一个整数。
int* pInt = nullptr;// 初始化为 nullptr
int* ptr = NULL; // 在 C++11 之前的代码中常见

初始化为变量的地址

可以通过取地址运算符 & 获取一个变量的地址,并将其赋给指针。这个指针现在指向了该变量。
int value = 5;
pInt = &value; // 指针pInt指向变量value的地址

初始化为数组的地址

也可以使用 new 关键字为一个数组分配内存。
void func()
{int arr[] = {1, 2, 3, 4, 5};int* ptrToArray = arr; // 数组名 arr 会被转换为指向数组首元素的指针/* 也可以指定数组中的特定元素 */int* ptrToElement = &arr[2]; // 指向数组 arr 的第三个元素的地址
}
void func1()
{int* arrayPtr = new int[10]; // 动态分配一个含有10个整数的数组// 记得删除分配的数组,使用 delete[]delete[] arrayPtr;
}
初始化为另一个指针的值
int* ptrToAnother = ptrToInt; // ptrToAnother 现在和 ptrToInt 指向相同的地址

初始化为动态分配的内存

使用 new 关键字动态地分配内存,并把返回的地址赋给指针。
int* ptrToDynamicInt = new int; // 使用 new 运算符分配一块内存,并将其地址赋给 ptrToDynamicIntint* ptr = new int; // 动态分配一个整数,并初始化指针
*ptr = 5; // 设置动态分配的整数的值为 5
// 记得在不需要时删除动态分配的内存
delete ptr;

常量指针和指针常量的初始化

初始化指向常量的指针(指针可以改变,但所指向的值不能改变)。
const int constantVar = 10;
const int* ptrToConst = &constantVar; // ptrToConst 可以指向别的地址,但不能通过 ptrToConst 改变所指向的值
初始化指针常量(指针一旦指向一个地址就不能改变,但可以通过指针改变所指向地址的值)。
int var = 10;
int* const constPtr = &var; // constPtr 的指向不能改变
*constPtr = 20; // 但 constPtr 指向的值可以改变

初始化为函数的指针

void myFunction() {// 函数体
}
void (*functionPtr)() = myFunction; // functionPtr 指向函数 myFunction// 假设有一个返回类型为 int,并接受两个 int 类型参数的函数
int add(int a, int b) {return a + b;
}
// 声明指向该类型函数的指针
int (*functionPtr)(int, int);
// 初始化指针,使其指向 add 函数
functionPtr = add;
// 现在,你可以通过指针调用函数
int result = functionPtr(3, 4); // 等价于调用 add(3, 4)//也可以在定义函数指针时直接初始化
int (*functionPtr)(int, int) = add;

列表初始化(C++11 及以后)

C++11 引入了列表初始化,可以用来初始化指针。
void func()
{int* ptrToZero = new int{};        // 分配的内存被初始化为 0int* ptrToArrayInit = new int[5]{}; // 分配的数组的每个元素被初始化为 0
}void func1()
{int* ptr = new int{5}; // 使用列表初始化动态分配的整数// 或者int value = 5;int* ptr = &value; // ptr 指向 value// 或者int* ptr{}; // 初始化为 nullptr
}

用 auto 初始化指针

使用 auto 时的注意事项,必须明确初始化语句
  1. 如果用变量的地址初始化指针,auto 将推导为相应的指针类型。
  2. 如果用 new 操作符初始化指针,auto 也会推导为指向新分配类型的指针。
  3. 当使用 auto 初始化数组名时,它会被推导为指向数组首元素的指针类型。然而,使用 auto& 可以使得推导出的类型为数组类型的引用。
  4. 如果用函数的名字初始化,auto 将推导为指向函数类型的指针。
//指向变量的指针
auto ptr = &var; // 自动检测到 var 是 int 类型,因此 ptr 是 int* 类型的指针//指向动态分配的内存
auto ptr = new int(5); // ptr 被推导为 int* 类型//指向数组的指针
int array[] = {1, 2, 3};
auto ptr = array; // ptr 被推导为 int* 类型,指向数组的第一个元素//指向函数的指针
void myFunction() {// 函数体
}
auto funcPtr = myFunction; // funcPtr 被推导为 void(*)() 类型//使用 auto 初始化 const 指针
/*当使用 auto 来初始化指向 const 数据的指针时,需要在指针声明中明确指定 const。*/
const int constantValue = 100;
auto constPtr = &constantValue; // constPtr 会被推导为 const int* 类型
/* 希望指针本身不可修改时,可以声明指向 const 类型的指针,但如果需要指针本身是 const(即不能指向其他地方),您需要使用后缀声明方式 */
int value = 10;
auto constPtr = &value; // constPtr 会被推导为 int* const 类型,如果 value 声明为 const 的话/* constPtr 本身是 const 的,它不能再指向另外的地址,但 *constPtr 的值可以改变,除非它指向的是一个 const 对象 */
注意事项
在使用指针时,始终要确保已经给它们赋了一个确定的、有效的地址。随机的、未知的或已释放的内存地址都可能导致未定义的行为。特别地,从未初始化、已释放或已解引用的指针里读取数据,或者向这样的指针里写入数据,都可能导致程序崩溃或其他意想不到的行为。

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

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

相关文章

财务涉及到的金额之间的关系

财务涉及到的金额之间的关系 无税金额 含税金额 / (1 税率)含税金额 无税金额 * (1 税率)税额 无税金额 * 税率 含税金额 / (1 税率) 税率税率{0.03、0.13…}

2019年认证杯SPSSPRO杯数学建模C题(第二阶段)保险业的数字化变革全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 基于统计建模的车险业数字变革研究 C题 保险业的数字化变革 原题再现: 车险,即机动车辆保险。保险自身是一种分散风险、消化损失的经济补偿制度,车险即为分散机动车辆在行驶过程中可能发作的未知风险和损失…

【Vue】Vue 路由的配置及使用

目录捏 前言一、路由是什么?1.前端路由2.后端路由 二、路由配置1.安装路由2.配置路由 三、路由使用1.route 与 router2. 声明式导航3. 指定组件的呈现位置 四、嵌套路由(多级路由)五、路由重定向1.什么是路由重定向?2.设置 redire…

奇安信天擎 rptsvr 任意文件上传漏洞复现

0x01 产品简介 奇安信天擎是奇安信集团旗下一款致力于一体化终端安全解决方案的终端安全管理系统(简称“天擎”)产品。通过“体系化防御、数字化运营”方法,帮助政企客户准确识别、保护和监管终端,并确保这些终端在任何时候都能可信、安全、合规地访问数据和业务。天擎基于…

C++类与对象【友元】

🌈个人主页:godspeed_lucip 🔥 系列专栏:C从基础到进阶 🎄1 友元🥑1.1 全局函数做友元🥑1.2 类做友元🥑1.3 成员函数做友元 🕮2 总结 🎄1 友元 生活中你的家…

ContentNegotiationManagerFactoryBean 内容协商

一.什么是内容协商 简单点说,就是同一资源,可以有多种表现形式,比如xml、json等,具体使用哪种表现形式,是可以协商的。 这是RESTfull的一个重要特性,Spring Web MVC也支持这个功能。 1.Spring MVC REST是如何决定采用…

深入了解性能优化(web应用)

影响一个系统性能的方方面面 一个 web应用不是一个孤立的个体,它是一个系统的部分,系统中的每一部分都会影响整个系统的性能 一.常用的性能评价/测试指标 1.响应时间 提交请求和返回该请求的响应之间使用的时间,一般比较关注平均响应时间。 常用操作的响应时间列表: 操作 响应…

深入理解Scrapy中XPath的`following-sibling`选择器

什么是XPath? 在深入following-sibling选择器之前,先简单了解一下XPath。XPath是一种在XML文档中查找信息的语言。它同样适用于HTML文档,因为HTML是XML的一种形式。XPath使用路径表达式在XML文档中进行导航。在网络爬虫框架Scrapy中&#xf…

探索 2024 年新副业:无人饮品机的新风向

随着科技的迅猛发展,无人饮品机作为一种全新的商业模式,正逐渐成为 2024 年副业的新风向。如果你还没有了解过这种全新的副业,那么现在是时候深入了解一下了。 D咖无人饮品机的优势在于其 24 小时不间断的营业模式,它可以在你睡觉…

Educational Codeforces Round 161 (Rated for Div. 2)补题

Tricky Template(Problem - A - Codeforces) 题目大意:现有三个模板字串a,b,c,都由小写字母组成,问能否找到一个字串s,使s与a,b匹配,与c不匹配,匹配的条件如下: 如果s的某位为小写…

边缘计算和联邦学习的联系

1. 什么是边缘计算? 边缘计算(Edge Computing)是一种计算模型,其主要思想是将计算、存储和数据处理能力推送到离数据源近的边缘设备,而不是依赖于远程的云服务器。这样做的目的是减少数据传输延迟、提高响应速度&…

web前端项目-中国象棋【附源码】

中国象棋 【中国象棋】是一款历史悠久、深受人们喜爱的策略类游戏。在Web前端技术中,我们可以使用HTML、CSS和JavaScript等语言来制作一款中国象棋游戏。玩家使用棋子(帅/相/士/炮/马/车/炮/卒)在棋盘上相互对弈,将对手的“帅”棋…

工作流管理框架airflow-安装部署教程

1 概述 Airflow是一个以编程方式编写,用于管理和调度工作流的平台。可以帮助你定义复杂的工作流程,然后在集群上执行和监控这些工作流。 Airflow计划程序在遵循指定的依赖项,同时在一组工作线程上执行任务。丰富的命令实用程序使在DAG上执行复杂的调度…

国产开源模型标杆,能力比肩ChatGPT!书生·浦语2.0发布,支持免费商用

1月17日,新一代大语言模型书⽣浦语2.0(InternLM2)正式发布并开源。 2种参数规格、3种模型版本,共计6个模型,全部免费可商用。 它支持200K超长上下文,可轻松读200页财报。200K文本全文范围关键信息召回准确…

Android13预装APP到data分区

修改步骤与Android11是差不多的,只是有部分代码所在位置不一样。 Android 11内置APP到data/app Android 8(O)预置APP到data/app 默认内置应用到data会出错 1970-01-01 08:03:54.499 1177-1177/system_process I/PackageManager: /data/app/xx changed; collecting…

Springboot日志框架logback与log4j2

目录 Springboot日志使用 Logback日志 日志格式 自定义日志格式 日志文件输出 Springboot启用log4j2日志框架 Springboot日志使用 Springboot底层是使用slf4jlogback的方式进行日志记录 Logback日志 trace:级别最低 debug:调试级别的&#xff0c…

Windows平台反调试技术学习

前言 前俩天的学习记录Windows上面的反调试学习,主要是参考《恶意代码实战分析》和《加密与解密》里面的,给每个小技术都写了程序示例,自己编译反调试了一遍。对于加解密一书是还有很多不理解的地方的,目前只能记录到这了&#x…

Nodejs 问题排查

前言 用于记录在使用 node 过程中遇到的问题,并尝试寻求解决方案。 问题 问题1 问题描述 访问前端页面时,页面返回 502/504。查看日志后发现,在一些出现问题的时间节点,会出现以下日志: epoll_wait() reported t…

自己动手写数据库系统:解释执行 update 和 delete 对应的 sql 语句

在上一节我们完成了 select 语句的解释执行,本节我们看看 Update 和 Delete 对应的语句如何解释执行,当然他们的实现原理跟我们前面实现的 select 语句执行大同小异。无论是 update还是 delete 都是对数据表的修改,因此他们的实现方法基本相同…

建筑类中级工程师职称证明业绩材料有哪些?

三、建筑类中级工程师职称造价类工程业绩材料 1.合同:证明项目合作关系的凭证。 2.预(结)算报告等(重点是体现封面有你的名字和执业印章等) 3.单位证明或任命书(本人在项目中的职务聘书) 4.工程获奖证明:项目获得市优的证书、省优…