C++学习-入门到精通-【6】指针

C++指针声明、初始化、基本操作和参数传递 这一系列文章用于记录技术小白在学习道路上遇到的那些坑,在刚开始接触C系列的编程语言的时候,相信很多人都对指针感到头疼,笔者也一样,第一次的从入门到放弃就出现在这里,时隔很久之后,决定好好学习一下,明知山有虎偏向虎山行。 1、声明和初始化指针 指针是一种变量,其值是一个内存地址。 形式如下: Type * pointerVariable; Type * pointerVariable = ad... 阅读详情

C++学习-入门到精通-【6】指针



一、指针的初始化

指针在声明或赋值时,应该被初始化为nullptr(C++11的新特性),或是一个相应类型的地址。当一个指针变量的值为nullptr时就称其为空指针。

注意所有使用的指针都应该进行初始化,以防止其指向一个未知的或未被初始化的内存空间

在早期的C++ 版本中,为空指针指定的值为0或者是NULL。NULL在多个标准库头文件中被定义,用来表示值0。

注意:声明中的*不是运算符,它只是表明正在被声明的变量是一个指针

二、指针运算符

地址运算符&

地址运算符是一个一元运算符,它获得操作数的内存地址。例如:

int y = 5; // 声明一个int类型的变量
int *yPtr = nullptr; // 声明一个指向int类型的指针变量,并初始化为nullptr

yPtr = &y; // 将y的地址赋值给yPtr

此时可以说变量yPtr指向y,yPtr间接引用变量y的值。

注意区分地址运算符&和引用变量声明中的&

间接引用运算符*

一元的*运算符通常称为间接运算符或间接引用运算符,它返回一个左值,表示其指针操作数所指向的对象。例如:

cout << *yPtr << endl;

该语句输出变量y的值,即5,与下面的语句等价;

cout << y << endl;

提示
间接引用一个空指针或未初始化的指针会导致不确定的行为,而且通常是一个致命的运行时错误,因此,在间接引用之前程序员应该明确知晓这个指针是指向哪里。

使用地址运算符&和间接引用运算符

#include <iostream>

using namespace std;

int main()
{
	int a = 7;
	int *aPtr = &a;

	cout << "The address of a is " << &a
		<< "\nThe value of aPtr is " << aPtr << endl;
	cout << "\nThe value of a is " << a 
		<< "\nThe value of *aPtr is " << *aPtr << endl;
}

运行结果:
在这里插入图片描述

三、使用指针的按引用传递方式

#include <iostream>

using namespace std;

void cubeByReference(int* x)
{
	*x = (*x) * (*x) * (*x);
}

int main()
{
	int i = 3;

	
	cout << "Cube of " << i << " is ";
	cubeByReference(&i); 
	cout << i << endl;
}

运行结果:
在这里插入图片描述

在C++中,所有的参数其实都是按值传递的。以使用指针变量的按引用传递方式传递一个变量实质上并没有按引用传递任何东西,传递的其实是这个变量的指针(这个变量的地址),将该地址复制到函数对应的指针形参中。然后被调函数可以通过间接引用这个指针来访问调用者中的这个变量,从而完成按引用传递。

四、内置数组

标准库函数的begin和end

在之前的章节中我们使用sort函数对一个元素类型为string的array对象进行排序,使用语句如下:

sort(colors.begin(), colors.end());

array类中的begin和end函数指定了排序的范围——整个array对象。对于内置数组而言,我们也可以使用sort对它进行排序,例如:

int n[5] = {5,3,4,2,1};
sort(begin(n), end(n));

注意之前介绍过的基于范围的for语句,它其实也是使用了循环对象的begin和end函数来确定循环的范围。

内置数组的局限性

  • 无法使用关系和相等运算符进行比较。如果要比较两个数组,需要使用循环,一个一个的进行比较;
  • 不能相互赋值;
  • 它们不知道自己的大小。处理一个内置数组的函数通常接收两个参数,一个是这个数组的名字,另一个是这个数组的大小;
  • 它们不提供边界检查功能,需要程序员手动检查是否越界;

五、使用const修饰指针

一个好的程序应该是遵循最小特权原则的,也就是一个函数是有足够的权限访问函数参数中的数据来完成指定的任务的,但是权限不能过大。

在之前写过的代码中我们也遵循着这样的原则,还记得之前使用过的const关键字吗。我们就更通过这个关键字实施最小特权原则的。

例如要打印一个array对象中的元素,但是不需要修改它:

array <int, 5> arr = { 1,2,3,4,5 };

for(const int& item : arr)
{
	cout << item << " ";
}
cout << endl;

上面的例子中使用一个引用变量来访问array对象中的元素,前面加上了一个const表明,在这个作用域中,item这个别名不应该修改它引用的值。这就保证在这个输出函数中,不会出现不合法的修改行为,导致出错。

将指针传递给函数有4种方式:指向非const数据的非const指针、指向const数据的非const指针、指向非const数据的constant指针、指向const数据的const指针;

看上去好像比较复杂,但是通过下图可以很容易的分辨它们:

int * i;

在这里插入图片描述

【C/C++】结构体指针赋值的方法 使用"*"操作符:通过解引用结构体指针访问结构体成员并赋值。使用"->"操作符:通过结构体指针访问结构体成员并赋值。这两种方法都可以对结构体指针所指向的结构体成员进行赋值操作。 阅读详情

相关推荐

C++从入门到精通系列教程之第六篇:指针与引用

大家好,欢迎继续关注C++从入门到精通系列教程!在前几篇文章中,我们已经学习了C++的基本语法、数据类型、控制流、循环、函数、数组与字符串等基础知识。这些内容为理解更深层次的C++概念奠定了坚实基础。本篇博客将深入介绍C++中两个十分关键的概念——与。通过本篇教程,你将学会如何使用指针进行内存地址的操作、进行动态内存分配,并了解引用的定义与用法,掌握它们在实际开发中的应用。文章中包含了详细的代码示例和中文注释,帮助新手逐步掌握指针与引用的核心概念。

氮气蜗牛的博客 1009

c++ 指针的初始化

/ 初始化为 nullptr// 在 C++11 之前的代码中常见初始化为变量的地址。

淘气の小狼人的博客 2995

C++学习之指针

指针是C++语言中非常重要的概念,它提供了对内存中数据的直接访问方式。指针存储了一个变量的内存地址,可以通过指针来访问和操作该变量。以下是指针的一些基本介绍:定义指针:在C++中,可以使用(星号)来声明一个指针变量。例如,int* ptr;声明了一个名为ptr的指向整数的指针变量。需要注意的是,指针变量在声明时应初始化为一个有效的内存地址。获取变量地址:使用取地址运算符可以获取一个变量的内存地址。例如,将ptr指向num的地址。解引用指针:使用解引用运算符可以访问指针所指向的变量的值。例如,会输出。

百锦再的博客 1万+

C++指针详解(指针初始化与回收,常量与指针,引用与指针)

C++指针详解1、指针的定义初始化以及回收2、常量与指针1)常量指针(常指针)2)指针常量3)总结3、引用与指针 1、指针的定义初始化以及回收 指针是一个地址,这个地址内存放数据,这些数据就叫做“指针所指的数据”或者“指针指向的数据”。 指针类型存储的是被存储的数据的地址,即p的值是地址,*p 是p这个地址指向的值。 普通类型: int main() { //空指针初始化 int* p = n...

lyz21的博客 4028

Visual C++ 6.0从入门到精通:全面掌握编程与开发

本文还有配套的精品资源,点击获取 简介:本书《Visual C++ 6.0程序设计从入门到精通》是为初学者和中级程序员量身打造的指南,旨在全面教授Microsoft Visual C++ 6.0编程环境的使用,深入探讨C++语言及其在Windows应用开发中的实际应用。本书提供了丰富的实例代码,帮助读者通过实践提高学习效率。它涵盖了从IDE基础操作、C++基础知识、面向对象...

weixin_35794316的博客 1217

Mac电脑本地安装Stable Diffusion小白教程避开所有坑教程

如果出现黄字部分警告,如WARNING: The scripts pip, pip3 and pip3.9 are installed inz‘/usr/local/opt/python@3.9/Frameworks/Python.framework/Versions/3.9/bin’ which is not on PATH)需要将其添加到path。下载pip,输入:curl https://bootstrap.pypa.io/pip/get-pip.py -o get-pip.py。

jackerjin123的博客 1799

C++中的指针初始化

C++中定义一个指针的时候,例如 int *p。 可以认为定义了两个内容,1:指针,2:指针的指向。需要对指针本身和指针的指向都进行初始化,既要初始化内存地址,也要定义内存中的内容。如果不进行指针的初始化,则内存地址随机分配。格根据编译器的不同,会出现警告或者报错不同等级的问题,在编译中也可能出现难以察觉的bug。 指针的初始化时等号左右两端都必须是内存地址。例如 int a; int ...

kangshuangzhu的博客 2万+

使用Termux在Android设备上编译运行SpecCPU2006

SPEC2006搭配Termux,竟然还能这么玩?!

菜菜的菜园子 2960

【C++】黑马程序员《C++从入门到精通》

黑马程序员《C++从入门到精通》--学习笔记第八部分:bug与思考01、iostream和iostream.h和stdio.h的区别02、#define和const的区别03、using names std 什么意思?04、数据类型的意义?第一部分:基础入门知识(1-71)01、课程安排02、C++书写helloworld03、程序的注释04、变量05、常量06、关键字07、标识符命名规则08、数据类型第二部分:通讯录管理系统(01-12)0102第三部分:C++进阶知识(01-64)0102第四部分:职工

浪里小飞侠的博客 2万+

【BAT32G113-仿真器及脱机烧录器教程-A3-2024/9/19】

提示:此壁纸收集于互联网,如有侵权,请联系作者!今日下班,闲来无事,就与生活中在乎的人闲日常,互相彼此增进一些友谊或爱意情愫!在座的朋友看到这里,有时间,抽抽空,多多联系一下,身边重要的人哟!四种指示灯和一个按钮:MODE->代表红色POWER->代表黄色ACTIVE->代表蓝色STATUS->代表XX(不记得了)黑色按钮:按键上电,会进入升级模式,这里我们一般默认不需要改变!仿真工具-ICE8-PRO介绍隶属于产品分支里。烧写工具-CMS-WRITER8 LITE介绍点击。

星新计划的博客 8264

SAP S/4HANA Cloud 管理员业务角色创建实战:基于 SAP_BR_ADMINISTRATOR 模板的一站式指南

摘要:SAP S/4HANA Cloud新系统初始登录时常见Fiori Launchpad无磁贴的问题,这是由于缺乏合适的业务角色分配。本文介绍了通过预交付的SAP_BR_ADMINISTRATOR模板创建管理员角色的完整流程,包括业务用户、业务角色和业务目录的核心概念解析。重点说明了直接使用模板的风险,并提供了从模板创建自定义管理员角色的详细步骤(4.1-4.3),以及权限限制设置的注意事项。文中还分享了一个实际项目案例,强调正确配置管理员角色对后续权限体系建设的关键作用。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 202

现代C++学习蓝图:一条从游戏编程入门到架构级精通的必经之路

在软件工程的广阔领域中,C++语言凭借其卓越的性能、对硬件的底层控制能力以及持续演进的现代化特性,始终占据着不可或-缺的核心地位。《C++游戏编程入门》一书的核心价值,在于它彻底颠覆了传统的“理论先行”教学模式,采用“项目驱动”的方法论,将C++知识点的学习过程,转化为一个个看得见、摸得着、玩得到的游戏项目开发实践。完成《C++游戏编程入门》的学习后,你将不仅掌握C++的核心语法和面向对象思想,更重要的是,你已经拥有了独立完成中小型项目的能力和信心,并对软件开发的完整生命周期有了初步的体验。

2301_80863610的博客 4万+

Android NDK/JNI面试题大全及参考答案(3万字长文)

是一套工具集合,它允许开发者为Android平台编写原生应用程序或者应用程序的部分模块。NDK 主要用于开发那些需要高性能计算的应用程序,例如游戏引擎、图像处理软件或音频/视频编码解码器等。通过使用 C 或 C++ 编写代码,开发者可以利用硬件加速功能,提高应用性能。NDK 提供了一系列工具来帮助开发者完成从源代码到可执行文件的整个过程,包括编译、链接、调试等功能。

大模型大数据攻城狮的专栏 1256

【C++入门到精通】智能指针 [ C++入门 ]

智能指针是一种能够自动管理动态分配的内存的特殊指针。相比于普通指针,智能指针能够避免内存泄漏等问题,提高程序的安全性和可靠性。内存泄漏是指程序无法释放已经分配的内存,造成资源浪费和程序不稳定。为了解决内存泄漏问题,可以使用 RAII 技术,即资源获取即初始化。该技术通过智能指针等方式管理内存,确保资源正确释放。智能指针的原理是基于 RAII 技术实现的,它封装指针对象并实现自动化的内存管理。内存泄漏可以分为堆内存泄漏和系统资源泄漏两种类型,可以使用工具进行检测和定位。

Yawesh的博客 2158

Oracle EBS 中美国销售税的实现方式

Oracle EBS通过eBTax引擎实现美国销售税管理,需配置税务管辖区、税率及规则等要素,基于收货地址和商品分类计税。系统支持免税交易和使用税处理,但因美国税率复杂多变,建议集成Vertex等第三方服务自动更新税率。关键配置包括创建USSales Tax制度、维护地点层级及物料税务分类,同时需管理客户免税证书。对于跨国业务,系统也支持欧盟VAT等其他国家税制配置。

金牌架构师 296

某招标公告网和vcaptcha验证码识别逆向

本文分析了某验证码系统的加密流程及破解思路。首先通过反混淆技术定位到加密函数,拆解了包含指纹函数、环境参数等组成的加密字符串。研究发现验证码生成涉及canvas指纹、环境检测等反爬机制,可通过模拟浏览器环境绕过。验证过程需要解密图片顺序,通过work2.js计算还原图片位置,再结合滑动轨迹、时间等参数生成验证请求。文章仅提供技术研究思路,强调需遵守法律法规,严禁非法破解信息系统。完整流程包括环境模拟、加密参数还原、图片处理和轨迹生成等步骤,成功率较高。

码王吴彦祖的博客 578

C++协程从入门到精通

协程(coroutine)是一种特殊的函数,它可以被暂停(suspend)、恢复执行(resume),并且一个协程可以被多次调用。C++中的协程属于stackless协程,即协程被suspend时不需要堆栈。C++20开始引入协程,围绕协程实现的相应组件较多,如co_wait、co_return、co_yield,promise,handle等组件,灵活性高,组件之间的关系也略复杂,这使得C++协程学习起来有一定难度。协程与传统函数不同,普通函数是线程相关的,函数的状态跟线程紧密关联;而协程是线程无关的,它

码事漫谈 3221

从 Open SQL JOIN 走向 ABAP CDS Association:把查询写成可复用的数据模型

摘要: 本文通过飞行模型示例,对比了ABAP中三种表关联实现方式:Open SQL JOIN、CDS显式JOIN和CDS Association。重点解析了Association的本质是将表关系声明为数据模型语言,使用时通过路径表达式按需展开为JOIN。文章指出路径表达式在不同位置会默认展开为不同JOIN类型(如SELECT列表默认为LEFT OUTER),并演示了如何用[inner]强制指定INNER JOIN。最后结合S/4HANA实际案例,说明Association通过中心化关系定义和路径复用,能有效

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 383

C++入门到精通指南

C++入门到精通指南C++是一门功能强大的编程语言,广泛应用于系统开发、游戏开发、高性能计算等领域。本指南将带你从C++基础知识入门,逐步深入到高级特性,最终达到精通水平。第一部分:C++基础编译器:GCC(MinGW)、MSVC、Clang集成开发环境(IDE):推荐使用 VS Code + MinGW 或 Visual Studio 作为初学者的开发环境。

yunxizujian的博客 1379

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【C++入门到精通】智能指针 shared_ptr 简介及C++模拟实现 [ C++入门 ]

shared_ptr 是C++中的智能指针类,通过引用计数机制管理堆内存对象的生命周期,并使用原子操作确保引用计数的线程安全性。它支持拷贝构造和赋值运算符重载,可以安全地共享指向同一块堆内存的对象。此外,shared_ptr提供了方便的访问和操作接口,是一种方便而安全的资源管理工具

Yawesh的博客 3687

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

论如何入门并精通C++

入门并精通C++需要系统化的学习和持续实践。

zhangyihao135的博客 838

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

如何学习C++:从入门到精通的实用指南

学习C++可能是一段艰难但充满回报的旅程。通过合理的学习计划和实践,你可以逐步掌握C++的基础和高级知识,并将其应用到实际项目中。记住,编程不仅仅是学习语法,更是培养解决问题的能力和编写高质量代码的技巧。坚持学习和探索,你将能够在C++领域成为一名出色的开发者。

热爱技术 1万+

【C++入门到精通】智能指针 auto_ptr、unique_ptr简介及C++模拟实现 [ C++入门 ]

这篇文章介绍了 C++ 中的两种智能指针:std::auto_ptr和std::unique_ptr。首先,文章简要介绍了它们的作用和使用示例。然后,对于std::auto_ptr,文章展示了一个简单的模拟实现,解释了每个函数的作用和实现原理。接着,文章介绍了更为严格的 std::unique_ptr,包括其特点、使用示例和模拟实现。对于模拟实现,文章详细解释了如何防止拷贝和赋值,并提供了两种不同的思路。整篇文章内容清晰明了,对于想要学习 C++ 动态内存管理的读者具有很好的参考价值。

Yawesh的博客 2727

【C++入门到精通】C++11 [ C++入门 ]

本文全面介绍了C++11标准所引入的新功能和改进,旨在帮助读者深入了解并掌握这一重要的编程语言版本。通过阅读本文,读者将全面了解C++11的创新之处,为未来的C++编程实践奠定扎实基础。

Yawesh的博客 948

C++ 学习路线:从入门到精通,全面掌握 C++ 编程

C++ 是一门强大且灵活的编程语言,适合各种类型的开发项目。通过遵循本文提供的学习路线,你将能够逐步掌握 C++ 的核心概念和高级特性,并最终成为一名熟练的 C++ 开发者。

不会编程的码农研究僧 2828

C++学习——指针篇

C语言C++指针

m0_73931287的博客 2536
上一篇: C++学习-骑士巡游问题
下一篇: C++学习-入门到精通-【7】类的深入剖析
YKPG
博客等级 码龄6年 344粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值