【C++】指针
推荐视频
内存
程序中最重要的一件事,就是内存。当启动一个程序的时候,所有的代码都被载入到内存当中,内存中的所有的二进制指令都在告诉计算机你的代码需要做什么。
没有内存,计算机什么都做不了,而指针对于管理和操纵内存十分重要。
什么是指针
指针是一个整数,一种存储内存地址的数字。(类型与这无关)
简单解释:假如只有一条街道和一排的房子,这就是计算机中的内存;这条街上的每一个房子都是一个内存字节,而每一栋房子都有门牌号,这就是这个字节对应的地址。假如你想上门送/取货,即读写内存字节,门牌号(指针)就告诉了我们需要送/取货的房子(对应内存字节)在哪。
程序演示
空指针
我们可以知道,类型不会改变一个指针的实质:指针的实质就是一个内存地址,是一个整数。
下面是一份完整的空指针代码:
点击查看代码
#include <iostream>
#define LOG(x) std::cout << x << std::endl;
int main()
{
void* ptr = nullptr;
std::cin.get();
return 0;
}
运行结果
这里可以看到空指针存储的内存地址值为x0x0000...

指针赋值
这里将会用指针赋值的方式来演示指针究竟是什么,以及其根本上有什么作用:
点击查看代码
#include <iostream>
#define LOG(x) std::cout << x << std::endl;
int main()
{
int var = 1;
int* ptr = &var;
*ptr = 8;
std::cin.get();
return 0;
}
运行结果
从结果中我们可以看到,指针ptr存储了var的地址&var,此时ptr = &var
程序中我们使用了 " * " 来反引用指针ptr,并将这个内存地址上的值修改为了100。
由于ptr = &var,通俗来说,我们作为为快递员,通过指针ptr 得到了门牌号(地址),知道了我们要送/取货的房子(内存字节),并使用 " * " 来敲门(反引用),将货物(值)送入了房子当中,进而将变量var的值给改变了。

内存
通过内存就可以很清晰的看见,此地址下的内存被改变成了8。
上面的例子创建了一个整数,而一个整数是4字节的内存,所以我们知道指针指向的内存是4个字节。
但实际上,我们并不知道指针指向的数据有多大,因为指针并不包含数据,它只包含了内存地址。

通过new来创建指针
之前都是在栈上创造的内存,现在使用new可以在堆上创造内存。
点击查看代码
#include <iostream>
#define LOG(x) std::cout << x << std::endl;
int main()
{
char* buf = new char[8];
memset(buf, 0, 8);
delete[] buf;
std::cin.get();
return 0;
}
运行结果
让我们看看在删除buf之前的值:
我们给指针分配了8个字节,用来存储数据的指针,指向数据开头。

内存

多重指针
还有另一点,指针同时也是变量,其存储的地址的值也会存储在某一内存地址中,那么就可以引申出用双重指针或三重指针等等,即指向指针的指针:
点击查看代码
#include <iostream>
#define LOG(x) std::cout << x << std::endl;
int main()
{
char* buf = new char[8];
memset(buf, 0, 8);
char** ptr = &buf;
delete[] buf;
std::cin.get();
return 0;
}
// 变量 <- 指针1存储变量的内存地址的值到某一内存地址中
// 指针1 <- 指针2存储指针1的内存地址的值到某一内存地址中
// 指针2 <- 指针3存储指针2的内存地址的值到某一内存地址中
运行结果

内存
二重指针ptr内存地址:

单重指针buf内存地址:

总结
指针只是存储内存地址的整数。
【C++】指针的更多相关文章
- TODO:Golang指针使用注意事项
TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...
- enote笔记法使用范例(2)——指针(1)智能指针
要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...
- C++虚函数和函数指针一起使用
C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...
- C++11 shared_ptr 智能指针 的使用,避免内存泄露
多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...
- c 数组与指针的使用注意事项
数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...
- Marshal.Copy将指针拷贝给数组
lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...
- C++智能指针
引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...
- EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针
一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...
- 智能指针shared_ptr的用法
为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...
- 智能指针unique_ptr的用法
unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...
随机推荐
- Excel中的数字转文本和文本转数字
公式方法: 数字转文本: =TEXT(A1,"?") 文本转数字: 直接乘以1即可 数字转文本: =A1*1 或者使用value函数 =value() 分列方法: 在数据工具&qu ...
- 利用PS调整图片光线明暗不均的情况
根据光源角度,利用快速蒙版和渐变工具选择暗区,借用曲线工具调整亮度,达到整体平衡 快速蒙版 渐变工具 使用黑白渐变从光线暗部拉到光线亮部,使图片蒙上一层渐变的红色 反选 取消快速蒙版,此时图片上会出现 ...
- 在专业iPaaS厂商与大型软件企业间如何选择
一. 什么是iPaaS产品专业厂商? 专业iPaaS厂商指的是那些只专注于投入到iPaaS产品研发的创新型企业.这些专业公司不仅具备了丰富的行业集成经验和深厚的专业知识,更以其独特的视角和专注的态度, ...
- POLIR-War-战争 的 正义论: 战争使"优胜劣汰":是斗争发展到最高级的形式 + 战争的优点
战争化解社会矛盾: 一.战争能"优胜劣汰" 对先进的政权,发展快速的政权, 战争可以使 "政权序列"重新排位. 例如WWWII时期,德.意.日 等国: 生产关系 ...
- POLIR-Economics-Investment: 公司估值模型(一)-- FCF模型
POLIR-Economics-Investment:投资与国际地缘政治 公司估值模型(一)-- FCF模型 Abbreviations FCF: Free Cash Flow DDM: Divide ...
- [题解] AT_abc_f Socks 4
AT传送门 洛谷传送门 题目大意 抽屉里有 \(n\) 种颜色的袜子,其中第 \(i\) 种颜色的袜子有 \(a_i\) 只. 最初,高桥把一只颜色为 \(c\) 的袜子放在抽屉外面,与这些袜子分开, ...
- win10系统电脑设置打印机连接的方法
有不少深度技术用户,不管说工作还是家里办公都需要使用到打印机.不过有小伙伴对win10系统不太熟悉,不知道如何找到打印机,也不知道设置在哪里,那么win10纯净版电脑打印机如何连接呢?接下来,深度技术 ...
- unity代码编译时间分析工具
https://github.com/needle-tools/compilation-visualizer 工具2 Editor Iteration Profiler (EIP) 地址: https ...
- 游戏技术分享网站 CEDEC
https://cedil.cesa.or.jp/ 日文的,但是可以搜到很有意思的技术分享,cedil 在知乎上也可以搜到CEDEC https://zhuanlan.zhihu.com/p/2408 ...
- luoguP1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles
[USACO1.5] [IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可 ...