指针的理解与使用---总结1

1.指针是什么?

指针实际是一个变量,只不过这个变量是存的地址,我们通过这个变量可以找到以它为地址的内存单元。
在这里插入图片描述

2.为什么一字节(byte)是8bit?

1bit 就是一个二进制位
1byte = 8bit
实际上是来源于ASCII码表,需要表示最少128个字符,所以要用8个bit位来表示。
地址存放东西的时候也要以字节为最小单位。
32位地址中,指针需要4个字节。64位指针为8个字节。
在这里插入图片描述

3.指针和指针类型。

指针类型是决定访问时取几个字节地址空间。
我们查看内存发现:
int类型存储时,占用4个地址。
在这里插入图片描述
char类型存储时,占用一个字节地址空间。
在这里插入图片描述
67305980 高位 低位
对应的二进制序列为 00000100 00000011 00000010 00000001
在这里插入图片描述
这里我们定义了一个char类型的数组。但是通过int类型指针访问时,直接在内存中取了4个地址空间大小。char应该取1个地址空间大小。
指针访问时取4个地址空间:
低地址 高地址
01 02 03 04
00000001 000000010 00000011 00000100
内存中这么存,所以这个是小端机

低地址存低位,高地址存的高位。(小端机)
低地址存高位,高地址存的低位。(大端机)

4.指针和数组

访问数组就是通过访问数组的头指针,实现对数组的访问。
arr 地址和 &arr[0]相同

5.一级指针二级指针作用。

一级指针:

通常我们可以通过一级指针实现数据的交换,我们在通过swap(a,b)函数交换ab 的值的时候,传地址才能完成交换。
不传地址情况下交换,实际上是重新开辟了一段地址,复制了a的值和b的值,然后对这个空间的a,b进行交换。执行完成后,临时拷贝的地址空间释放,最后返回原来地址,但是原来的地址里面存放的a,b并没有交换,所以我们要通过传递指针,来完成对当前地址进行交换。
我们来查看一下地址,来了解这个过程。
在这里插入图片描述

二级指针通常用法:

我最开始学的时候也不理解,因为通过一级指针就能完成数据的更新,为什么还要二级指针的,学到链表的时候,我通过查看内存发现,当对链表实行数据修改时,也就是要改变当前指针的指向,我们直接传递指针的话,也是临时拷贝了指针,放到一个新的空间下面,对这个空间的指针进行修改,但是原来存放指针的地址空间的指针指向并没有改变,所以必须通过二级指针完成对当前指针的地址的更新,才能实现对链表的更新。这里有一个特殊点,就是尾部插入时,一级指针就可以完成交换,因为新拷贝的指针,指向的地址空间还是原来的位置,我们通过这位置访问到当前地址的下一个指针时,是确确实实的访问,而不是临时拷贝。

举个例子,原指针相当于一把钥匙,我们重新开辟一个地址空间,存当前的指针,相当于配了一把钥匙,我们对配的钥匙进行改装时,原来的要是还是可以开门啊。
但是某个位置插入时,相当于我们用配的钥匙进门去拿东西,拿完我们把钥匙销毁,但是我们用原来的钥匙进门后,发现东西确实动了。

这篇是我在实现链表时的博客里面有详细的内存调试

发布了79 篇原创文章 · 获赞 6 · 访问量 3775

猜你喜欢

转载自blog.csdn.net/qq_41152046/article/details/105115601