C++指针Pointer!!!!!!!!!!

 1.理解指针,你要先理解内存,所以你要先具备一些计算机组成原理的知识,你要理解内存是激素那几重要的组成部分,没有内存,就什么指令都做不了,而指针就是用来管理和操作内存的,指针就是一个数字,这个数字代表了对内存的编号。你可以把内存想像成一条大条街道,这个街道又开始也有结束,街道上的一排排房子就代表存放数据的内存,每一幢房子代表一个内存单元即一个字节,而房子的编号和地址,就看作是内存的编号。我们需要知道这些房子的地址(内存)来完成货物(数据)的投递送出(读写)

2.好了现在你知道指针只是一个地址,忘掉定义指针时带上的数据类型(int *p)指针和这些类型无关,让我们看一些例子。

下面这个例子首先定义了一个void类型的指针(line8),这个指针指向一个存放整型数据的内存地址(line9),line10可以直接打印出这个指针的地址(0x61fe14,一会我们来讲一下这个地址),line11打印指针ptr的大小(我们说过指针就是用来操作内存,它本身就是一个编号,指针的大小取决于https://blog.csdn.net/weixin_43641850/article/details/102765863),我这里是64位操作系统,所以是8个字节;

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int var = 12345678;
 8     void *ptr = nullptr;
 9     ptr = &var;//到此为止是表示一个空类型的指针指向一个int型的内存地址
10     cout << ptr << endl;//查看定义的指针的地址
11     cout << sizeof (ptr);
12     *ptr = 4;
13 
14     return 0;
15 }

然后我们想要修改指针指向的值(line12),则会提示error: incomplete type 'void' is not assignable,这是一个数据类型检查的报错,为什么会出现这种报错呢?因为我们不能把一个整型赋给一个空类型,空类型?是的指针前加*表示取出指针所指的值,但是这个值是2个字节的short类型?还是4个字节的int类型,还是8个字节的longlong类型?要知道,C++最基本的概念就是数据类型!

void *ptr表示我们现在不关心这个指针时什么类型的,我们只是想保存一个地址(line8) 

内存地址没有0,所以void *ptr=0表示这个指针目前时无效的,也就是还没有指定好要访问哪个地址,这个时候,如果我们要读写则程序会甭哭,所以使用指针前的一个好习惯时先判断指针是否为空(也可以用关键字Nullptr)

 同样的我们也可以用打断点的方式查看指针在内存的样子,向下看,我们将断点这只在line9,在指针名上右键选择打开内存编辑器->打开对象的地址(绿色圆角矩形框)和右键打开指针的地址(红色圆角矩形框)

看到上面图中计算器进制转换的图你可能会有疑问?内存里存的是4e 61 bc,为什么在进制转换是输入的bc 61 4c呢?

这就要提到计算机中的大端存储和小端存储,https://blog.csdn.net/weixin_43886592/article/details/106336154,所以根据上图显示很明显是高位存在了高地址,是小端模式(有人要问了怎么判断高位呀?十位比个位高,百位比十位高,12345678-高位是1,换算成十进制高位是c)

 PS:这天又用到memcmp函数,这是个内存比较字符串的方法,又看了下两个字符串在内存中的内容,结果就是:字符串不存在大小端问题,字符串的存储单位是字符,一个字符占用内存一个字节

 

posted @ 2022-04-23 22:15  我们都不是哈士奇  阅读(156)  评论(0编辑  收藏  举报