推荐视频

【16】【Cherno C++】【中字】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++】指针的更多相关文章

  1. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  2. enote笔记法使用范例(2)——指针(1)智能指针

    要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...

  3. C++虚函数和函数指针一起使用

    C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...

  4. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  5. c 数组与指针的使用注意事项

    数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...

  6. Marshal.Copy将指针拷贝给数组

    lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...

  7. C++智能指针

    引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...

  8. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  9. 智能指针shared_ptr的用法

    为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...

  10. 智能指针unique_ptr的用法

    unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...

随机推荐

  1. Excel中的数字转文本和文本转数字

    公式方法: 数字转文本: =TEXT(A1,"?") 文本转数字: 直接乘以1即可 数字转文本: =A1*1 或者使用value函数 =value() 分列方法: 在数据工具&qu ...

  2. 利用PS调整图片光线明暗不均的情况

    根据光源角度,利用快速蒙版和渐变工具选择暗区,借用曲线工具调整亮度,达到整体平衡 快速蒙版 渐变工具 使用黑白渐变从光线暗部拉到光线亮部,使图片蒙上一层渐变的红色 反选 取消快速蒙版,此时图片上会出现 ...

  3. 在专业iPaaS厂商与大型软件企业间如何选择

    一. 什么是iPaaS产品专业厂商? 专业iPaaS厂商指的是那些只专注于投入到iPaaS产品研发的创新型企业.这些专业公司不仅具备了丰富的行业集成经验和深厚的专业知识,更以其独特的视角和专注的态度, ...

  4. POLIR-War-战争 的 正义论: 战争使"优胜劣汰":是斗争发展到最高级的形式 + 战争的优点

    战争化解社会矛盾: 一.战争能"优胜劣汰" 对先进的政权,发展快速的政权, 战争可以使 "政权序列"重新排位. 例如WWWII时期,德.意.日 等国: 生产关系 ...

  5. POLIR-Economics-Investment: 公司估值模型(一)-- FCF模型

    POLIR-Economics-Investment:投资与国际地缘政治 公司估值模型(一)-- FCF模型 Abbreviations FCF: Free Cash Flow DDM: Divide ...

  6. [题解] AT_abc_f Socks 4

    AT传送门 洛谷传送门 题目大意 抽屉里有 \(n\) 种颜色的袜子,其中第 \(i\) 种颜色的袜子有 \(a_i\) 只. 最初,高桥把一只颜色为 \(c\) 的袜子放在抽屉外面,与这些袜子分开, ...

  7. win10系统电脑设置打印机连接的方法

    有不少深度技术用户,不管说工作还是家里办公都需要使用到打印机.不过有小伙伴对win10系统不太熟悉,不知道如何找到打印机,也不知道设置在哪里,那么win10纯净版电脑打印机如何连接呢?接下来,深度技术 ...

  8. unity代码编译时间分析工具

    https://github.com/needle-tools/compilation-visualizer 工具2 Editor Iteration Profiler (EIP) 地址: https ...

  9. 游戏技术分享网站 CEDEC

    https://cedil.cesa.or.jp/ 日文的,但是可以搜到很有意思的技术分享,cedil 在知乎上也可以搜到CEDEC https://zhuanlan.zhihu.com/p/2408 ...

  10. luoguP1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles

    [USACO1.5] [IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可 ...