首页 > 编程语言 >【C++学习笔记 3】指针

【C++学习笔记 3】指针

时间:2024-06-16 09:00:38浏览次数:31  
标签:变量 笔记 C++ 内存 value 引用 Increment 指针

指针的本质

指针实际上就是一个整数,存储着一个内存地址。
不必执着于用“类型”的概念区分,那只是为了方便设计出来的,所有的指针,本质上都是一个整数,存储着一个内存的地址。

#include <iostream>

#define LOG(x) std::cout << x << std::endl

int main() 
{
	int var = 8;
	void* ptr = &var;
	std::cin.get();
}

当在类型后加*时,意味着这个变量是个指针,当在变量前加&时,表示在问这个变量:“你的地址是啥?”。
在定义指针变量这行打上断点,运行后发现指针变量的确存储一个数,在内存视图进入这个数表示地址,可以看到里面存储着8。
在这里插入图片描述
当改变指针类型为int,可以发现做的事情并没有变。给指针定义类型,只是告诉我们这里住着什么样的数据,它是帮助我们操作内存的工具,仅此而已。
在这里插入图片描述
将指针类型改为void,此时访问从指针的角度访问变量var,即通过门牌号去敲门。此时编译器报错,因为指针的类型是void,这会使编译器不知道要操作多大的内存空间。
在这里插入图片描述
另外,指针本身也是存储在内存里的变量,这意味的指针同样存在指针,可以定义指针的指针的指针。。。
但指针的本质不变,它只是一个整型,存储着一个内存的地址。

引用,reference

从本质上来讲,指针与引用是一回事,引用是指针的语法糖,可以使代码更易读。
区别在于,指针可以定义为指向空,而引用必须是已经存在的变量,引用不真正占用内存,并不像之前的那些类型那样存储数据。

#include <iostream>

#define LOG(x) std::cout << x << std::endl

int main() 
{
	int a = 8;
	int& ref = a;
	std::cin.get();
}

在这段代码中,int&表示创建了一个引用,这也意味着给a起了一个别名(alias) 。
现在创建一个函数,让输入的值递增

void Increment(int value)
{
	value++;
}

如果此时调用函数:Increment(a),然后查看a的值,会发现它并没有增加,因为此时做的事传值调用(passing by value),也就是说只是在函数内定义了一个等于5的value变量,而并非对a进行操作。所以,不妨直接传入a的地址,让函数读取a的内存地址,这样就可以直接对a进行操作了。

void Increment(int* value)
{
	*value++;
}

将函数改成这样,调用需要写成Increment(&a)*value代表逆向引用,表示改变的是该地址下的值,而不是表示地址的数本身。 但这样写有些复杂,符号太多,所以可以用引用的形式,做引用传递。

void Increment(int& value)
{
	value++;
}

将函数的形参改为引用的形式,调用时也可简化为Increment(a),代码做的事其实一模一样,但是具有了更好的可读性。
另外,在使用引用时,必须在声明的时候就进行赋值,在这之后,想要改变引用指向的对象是做不到的。


教程来源:The Cherno C++ 教程

标签:变量,笔记,C++,内存,value,引用,Increment,指针
From: https://blog.csdn.net/m0_59669215/article/details/139708928

相关文章

  • 2024华为OD机试真题-堆内存申请-(C++/Python)-C卷D卷-100分
    2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++)题目描述有一个总空间为100字节的堆,现要从中新申请一块内存,内存分配原则为:优先紧接着前一块已使用内存,分配空间足够且最接近申请大小的空闲内存。输入描述第1行是1个整数,表示期望申请的内存字节数第2到第N行是用空格......
  • 2024华为OD机试真题-围棋的气-(C++/Python)-C卷D卷-100分
     2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述围棋棋盘由纵横各19条线垂直相交组成,棋盘上一共19x19=361个交点,对弈双方一方执白棋,一方执黑棋,落子时只能将棋子置于交点上。“气”是围棋中很重要的一个概念,某个棋子有几口气,是指其上下左右方向四个相......
  • 程序设计与算法(三)C++:第五章poj代码
    课程:北京大学程序设计与算法(三)   MOOCOJ:OpenJudge019:全面的MyString这个题也是有很多的成员函数,我们来从主函数分析一下:MyStrings1("abcd-"),s2,s3("efgh-"),s4(s1);//无参构造,有参构造,复制可以不写 MyStringSArray[4]={"big","me","about","take"......
  • 【JAVA开发笔记】实战演练,如何用EasyExcel导出表格,并且自定义合并单元格
    目录1.前言2.EasyExcel简介3.EasyExcel简单导出案例讲解3.1EasyExcel依赖引入3.2测试类创建3.3Excel导出实现4.EasyExcel合并单元案例讲解4.1实现自定义合并策略4.2 使用自定义合并策略5.总结1.前言项目上,需将一个列表数据导出Excel表格,并将指定列相同......
  • 《曾国藩家书》读书笔记
    信息《曾国藩家书》曾国藩摘录警句些小得失不足患,特患业之不精耳。所谓诚意者,即其所知而力行之,是不欺也。知一句便行一句,此力行之事也。此二者并进,下学在此,上达亦在此。(所谓诚意,就是根据知道的去做,诚实不欺。知道一句就按照这句说的去做,这是身体力行的事情。能够做到格物与......
  • 《计算机组成原理与汇编语言程序设计》读书笔记
    信息《计算机组成原理与汇编语言程序设计(第4版)(高等学校规划教材)》徐洁电子工业出版社摘录硬件组成在早期,冯·诺依曼将计算机的硬件组成分为5大部件。几十年来,计算机硬件系统已有了许多重大变化。首先,现在采用的大规模及超大规模集成电路,可将运算器和控制器集成在一块芯片......
  • 《mysql必知必会》读书笔记
    信息《MySQL必知必会》福塔人民邮电出版社摘录基本概念数据库保存有组织的数据的容器(通常是一个文件或一组文件)。表某种特定类型数据的结构化清单。模式关于数据库和表的布局及特性的信息。有时,模式用作数据库的同义词。主键一列或一组列,其值可以唯一区分表中......
  • 机器视觉入门学习:YOLOV5自定义数据集部署、网络详解、损失函数(学习笔记)
     前言源码学习资源:YOLOV5预处理和后处理,源码详细分析-CSDN博客网络学习资源:YOLOv5网络详解_yolov5网络结构详解-CSDN博客YOLOv5-v6.0学习笔记_yolov5的置信度损失公式-CSDN博客 本文为个人学习,整合各路大佬的资料进行V5-6.0版本的网络分析,在开始学习之前最好先去学习YOL......
  • 从零开始学算法/C++/第三天
    懒标记好简单,原理就是使变化的叠加尽可能远离叶子节点,也就是说从叶子节点往根节点走,这条路径上最多只有一个地方有懒标记,要将这个懒标记尽可能远离叶子节点,拖延症了属于是,这样显然时间复杂度相较不用懒标记的要低很多。算法竞赛进阶指南里面称懒标记为延迟标记,这两种称呼都很......
  • c++_0基础_讲解6 循环语句
    for循环C++中的for循环是一种控制流语句,用于重复执行一组语句,直到指定条件为假。它是C++中最常用的循环结构之一,提供了灵活的控制循环的方式,能够在各种情况下进行迭代和循环操作。for循环由三个重要部分组成:初始化、条件和迭代器。其语法形式如下:for(初始化;条件;迭代器)......