C语言的内存、指针与数组

Posted by KalosAner on December 1, 2022

C语言的指针可以当成一个特殊的数据类型(像int一样的数据类型),可以说其唯一的作用就是为了存储地址,其他的都可以当作它的衍生用法。 指针的诸多功能都是基于其能直接操作指定内存空间存储的值,每个程序运行都会由操作系统分配一段内存空间,程序会给这段内存空间的每一个字节编号,这个编号就是这个字节所在的地址,指针就是一种可以存储这个编号的数据类型,并且可以通过指针对这个地址的值进行编辑。 指针是有类型之分的(如int *char *),因为不同类型的数据在内存里边地址是不同的,虽然每个字节都有一个地址,但是在程序分配给int数据时会把4个字节整个分配(这个4个字节可以简称为一个int空间),所以指向int类型数据的指针存储的是该int空间的首地址,但是这个指针是可以对这一整个int空间存储的值进行更改的。

如图是内存空间的逻辑结构示意图(在研究内存空间时我们无需了解真正的物理结构),每个方框就是一个字节,方框前面的数字就是它的地址:

77088884d2d384da82b5bfd975ba593f

如上图假如申请一个 int a = 10; 内存在存储时会转换成二进制存储,00000000000000000000000000010010(一个int占4个字节,一个字节8个bit,一个bit就是一个位,所以一个 int 有 32 位),那么这个int在内存里边就会占 4 个字节也即 62fe14~62fe17。一个数组就是一段联系的 int 空间,如果定义int b[2];就可以分配空间 62fe14~62fe21。这时b本身就可以当作一个不可修改位置的指针,其始终指向 62fe14。而直接int *p得到的指针一开始没有指向任何地址,但是其可以指向任意地址(程序所允许的地址),当执行 p = b 时,这个是 p 可以当作拥有和 b 完全一样的功能,唯一的区别就是p还可以指向其他地址。这是 int 类型的指针,其他类型的也类似。 不同类型的指针执行p+np是一个指针,n是任意数值)时,位置挪移的字节数不同,位置挪移的字节数和类型占的字节数有关,就是一个int *p,如果p此时等于 62fe14p 指向何地址,那么 p 的值就是多少,而 *p 才是这个地址空间存储的值),那么 p+1 就等于 62fe18。 如果p是char *的指针,p 此时等于 62fe14,那么 p+1 就等于 62fe15。 如图是16进制下的加减,可自行演算。

8dbe3579166d5e7652984807c51fb5f8

声明:本文只是为了方便理解指针,所以叙述所使用的言语不可避免有纰漏,此外如果发现有什么理解上的错误恳请批评指正。