首页 > 编程语言 >C++学习笔记#01——指针与链表

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

时间:2025-01-06 22:55:04浏览次数:1  
标签:arr 01 int C++ 链表 数组 内存地址 ptr 指针

在自学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 链表

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

标签:arr,01,int,C++,链表,数组,内存地址,ptr,指针
From: https://www.cnblogs.com/Linstone/p/18653150

相关文章

  • #define int long long 必须写在#include<bits/stdc++.h>的下方
    #include<bits/stdc++.h>usingnamespacestd;intd2[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};intx,y,k,l;intvis[25][25];inta[25][25];boolcheck(intm,intn){ if(m<0||n<0||m>x+1||n>y+1) returnfalse; ret......
  • Diary - 2025.01.06
    发现昨天日期写成2024了。明天计划来说应该是主要写题解了!!!上午还有个模拟赛,但是说不定又是像之前那样拉个USACO来(?)。仍记那时USACO金组没ak,t3被卡常了,6。明天要写的题解:LuoguP11513[ROIR2017Day2]培训LuoguP11509[ROIR2017Day1]挖矿机器人LuoguP1004......
  • 题解:P11507 [ROIR 2017 Day 1] 计算器
    P11507[ROIR2017Day1]计算器思路简单的动态规划。\(dp_{i,j,k}\)表示使用了\(i\)次按钮A,\(j\)次按钮B和\(k\)次按钮C。转移式:\[\begin{cases}dp_{i+1,j,k}=\min(dp_{i+1,j,k},\lfloordp_{i,j,k}\div2\rfloor);\\dp_{i,j+1,k}=\min(dp_{i,j+1,k},\lfloo......
  • 142环形链表
    最简单的思路:哈希。进阶那个快慢指针确实想不到。//哈希,空间为O(n)classSolution{public:ListNode*detectCycle(ListNode*head){unordered_set<ListNode*>adds;if(head==nullptr)returnNULL;ListNode*cur=head;......
  • 【SDOI2017】苹果树
    感觉出息了,从2024暑假开始接触这道题,今天才刚刚会。link题意给出一棵树,每个节点上有\(a_i\)个苹果,价值为\(v_i\),如果一个点取了苹果那么父亲也要取,设取了\(t\)个苹果,取苹果的最大深度为\(h\),那么要求\(t-h\lek\)(\(k\)给定),求最大价值。弱化版问题弱化版:\(t\lek\)......
  • 深入Android架构(从线程到AIDL)_14 应用Android的UI框架01
    应用Android的UI框架系列:以设计游戏循环(GameLoop)为例,內容如下:1.UI线程、View与onDraw()函数2.基本游戏循环(GameLoop)3.使用UI线程的MQ(MessageQueue)4.诞生一个小线程,担任游戏线程5.小线程調用postInvalidate()6.设计一个GameLoop类别7.只诞生一次GameLoop......
  • 合并两个排序的链表(C++)
    问题描述输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。数据范围:0≤n≤10000≤n≤1000,−1000≤节点值≤1000−1000≤节点值≤1000要求:空间复杂度O(1)O(1),时间复杂度O(n)O(n)如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,......
  • 01背包问题 Golang实现
    背包问题的分类:01背包描述:有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。思路分析:问题核心:从给定的......
  • JSP程序设计2016花店在线销售管理系统(源码)
    项目包含:源码、讲解视频、说明文档,部署录像运行环境:推荐jdk1.8开发工具:Eclipse、MyEclipe以及idea(推荐)操作系统:windows108G内存以上(其他windows)浏览器:GoogleChrome(推荐)、Edge、360浏览器;数据库:MySQL5.7;数据库可视化工具:NavicatPremium推荐)以及其他Navicat版本......
  • UG NX二次开发(C++)-UFun函数-按照特定方向提取轮廓线
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录1、前言2、UF_CURVE_create_shadow_outline帮助说明3、工作视图向WCS视图变换4、完整代码5、测试结果1、前言提取轮廓线在UGNX二次开发过程中比较多,其可以通过UF_CURVE_create_shadow......