内存、指针与数组

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

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

如上图假如申请一个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+n(p是一个指针,n是任意数值)时,位置挪移的字节数不同,位置挪移的字节数和类型占的字节数有关,就是一个int *p,如果p此时等于62fe14(p指向何地址,那么p的值就是多少,而*p才是这个地址空间存储的值),那么p+1就等于62fe18。
如果p是char *的指针,p此时等于62fe14,那么p+1就等于62fe15。
如图是16进制下的加减,可自行演算。
内存、指针与数组_第2张图片
声明:本文只是为了方便理解指针,所以叙述所使用的言语不可避免有纰漏,此外如果发现有什么理解上的错误请马上私信我。

你可能感兴趣的:(C语言,C语言)