C++学习笔记#01——指针与链表

news/2025/1/8 0:54:09/文章来源:https://www.cnblogs.com/Linstone/p/18653150

在自学C++的时候,发现指针是一个很难绕开的东西,看了一些参考资料和别人的程序,写一些垃圾。

Part 1 指针

指针是一个指向一片内存地址的变量,相当于家的门牌号。我们即可以通过变量名来访问一个变量,也可以通过它对应的地址来访问。就像你的老师可以点你的名字找你,也可以找你宿舍的门牌号来找到你()。

指针的基本操作——创建,赋值

创建与赋值

在C++中,指针通过一个 “*” 定义,例如:

int *ptr;
int* ptr;

这两种方法都是可行的。需要注意的是,这时侯的指针没有被初始化,是一个“野指针”,访问其会导致不可预期的问题。因此,我们要对其进行初始化:

ptr = nullptr;

(在C++11标准前,初始化为NULL)

或者,假如我们有一个变量val:

ptr = &val;

其中,“&”为取地址运算符,把这个变量的地址赋给这个指针,而不是这个变量本身,否则将导致未定义行为。

一个int类型的指针不仅可以指向一个int,还可以指向一个int类型的数组。

int arr[5];
ptr = &arr;

此时,指针ptr指向arr数组第一个(即索引为0)的地址。

亦或者,我们可以new运算符,为这个指针分配一个新的内存

int ptr = new int;

这样,指针ptr就指向了一片新的内存空间,大小为一个int(4字节)。

此外,我们也可以使用指针来创建并管理一个数组。

int *arr = new int[5];

这样就得到了一个arr数组,它的操作和普通的数组没有区别:

//对数组进行赋值并输出
for(int i = 0; i < 5; i++){arr[i] = i;}for(int i = 0; i < 5; i++){cout << arr[i] << " ";}

基本操作——(解)引用,移动

指针的解引用是指通过指针变量访问其指向的内存地址所存储的数据。指针本身存储的是内存地址,而解引用操作则是获取该地址中存储的实际数据。
解引用操作符:*
用法:

*ptr //需要搭配其它的操作,否则没有意义

我们可以使用+=,-=等运算符对内存的数据进行修改,如:

*ptr += 1;

*ptr += 1 与 ptr += 1?——指针的移动

我们必须要注意的是,ptr += 1 与 ptr += 1是两种完全不同的运算。前者表示修改内存地址的数据,而后者表示修改指针指向的内存地址,将内存地址向后移动一定字节,具体取决于数据类型,如一个int4字节,一个char1字节,等等。
此外,ptr++,
ptr++与ptr += 1是一样的操作。
这样,我们就可以使用指针对像数组这样连续的内存进行访问。

//假定已有数组arr[],大小为5,内容为{0,1,2,3,4}int *ptr3 = arr;int cnt = 0;while(cnt < 5){cout << *ptr3 << " ";cnt++;  ptr3++;//与ptr+=1等价}

运行,输出为:

0 1 2 3 4

如果我们将cnt < 5改为cnt < 10,再次运行:

0 1 2 3 4 1868770670 754697088 61231 17653600 0

显然,程序输出了无法预期的结果。
我们在实操时必须时刻注意,以免访问无效内存,造成运行崩溃或者难以预期的错误。

Part 2 链表

———————————————持续更新中———————————————

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

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

相关文章

一文说透汇编语言中的各种地址

本文讨论了学习汇编语言时一些易混淆的、关于地址的概念前言 由于笔者水平有限,随笔中难免有些许纰漏和错误,希望广大读者能指正。 一、各种地址之间的区分 笔者在刚开始学习汇编语言时,不是很能分清楚汇编地址、逻辑地址、物理地址、段地址、偏移地址、线性地址等概念,这对…

什么是自动化测试?为什么要做自动化测试?如何学习自动化测试?

自动化测试是指使用软件工具和脚本来执行测试任务的过程。它可以自动化执行测试用例、生成测试报告和进行结果分析。自动化测试可以减少人工测试的工作量,并提高测试的效率和准确性。它在软件开发过程中起到了重要的作用,可以帮助开发团队快速发现和修复软件中的缺陷,确保软…

o3 发布了,摔碎了码农的饭碗

大家好,我是汤师爷~ 在 2024 年底,OpenAI 发布了最新推理模型 o3。o3模型相当炸裂,在世界级编程比赛中拿下第 175 名,打败 99.9% 的参赛者。AI 写代码都赶上顶级程序员了,程序员是不是要失业?最近不少读者反馈,像 GitHub Copilot、Claude Sonnet 3.5、Cursor 等 AI 辅助…

Diary - 2025.01.06

回到正轨了,感觉今天好像不太摆了,但还是在小摸阿发现昨天日期写成 2024 了。明天计划来说应该是主要写题解了!!! 上午还有个模拟赛,但是说不定又是像之前那样拉个 USACO 来(?)。 仍记那时 USACO 金组没 ak,t3 被卡常了,6。 明天要写的题解:Luogu P11513 [ROIR 201…

前端必备基础系列(七)原型/原型链/this

对象的原型: JavaScript中每个对象都有一个特殊的内置属性[[prototype]],这个特殊属性指向另外一个对象。 当我们访问一个对象上的某个属性时,首先会检查这个对象自身有没有这个属性,如果没有就会去[[prototype]]指向的对象查找。 那么这个特性就可以帮助我们实现继承了。 …

cv2.imwrite保存的图像是全黑的

1.保存,全黑的图像cv2.imwrite(img/test.jpg, imutils.resize(enhancedImg, height=151,width=240))2.原因分析 3.原本image是0-255的数值,现在标准化了,全都是0-1之间的数值,还原,乘以255,图片输出正常。cv2.imwrite(img/test1.jpg, imutils.resize(enhancedImg, height…

SaltStack快速入门

Saltstack快速入门 saltstack介绍 Salt,一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯 主要功能:远程执行 配置管理,参考官方文档: http://docs.saltstack.cn/ 安装说明: https://docs.s…

计数问题选讲做题记录

从 $1+1$ 到 $\exp(\sum\limits_{i=1}^k\ln(1+ix))$。计数杂题。calc 考虑先不管数字之间的顺序,最后给答案乘上一个 \(n!\)。 记 \(dp_{i,j}\) 表示前 \(i\) 个数在 \([1,j]\) 之间选,所产生的总贡献,显然有 \(dp_{i,j}=dp_{i,j-1}+j\times dp_{i-1,j-1}\),最后的答案是 \…

如何构建高效的智能体

简单才是王道:构建高效 AI 智能体的秘诀!工作流为简单任务提供可预测性,而智能体在复杂场景中展现灵活性。本指南深入解析如何优化工具设计、选择框架,并平衡复杂性与性能,助你构建可靠且高效的 AI 系统。 如何构建高效的智能体Anthropic 刚刚发布了一份关于“如何构建高…

昆明理工大学计算机891考研复试真题

--昆工昆明理工大学计算机技术人工智能软件工程网络空间安全计算机系统结构计算机软件与理论计算机应用技术网络与信息安全408考研综合程序设计891计算机专业核心综合数据库系统原理