C语言之指针的奥秘(一)

一、内存和地址

1.内存

计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那当我们买电脑时,电脑上内存有8GB/16/32GB等,那这些内存空间如何高效管理呢?

其实把内存划分为一个个内存单元,每个内存单元的大小取1个字节。

计算机中常见的单位:

一个比特位可以存储一个2进制的位1或者0

bit - 比特位                                                    1byte=8bit

byte - 字节                                                     1KB=1024byte

KB                                                                 1MB=1024KB

MB                                                                 1GB=1024MB

GB                                                                 1TB=1024GB

TB                                                                  1PB=1024TB

PB

假设有一栋宿舍楼里,当你的朋友来找你玩,如果想找到你,就要挨个房间找,这样效率很低,但是当你的朋友知道楼层以及房间号,就很快的找到你。

其实每个内存单元相当于一个宿舍,一个字节放8个比特位,就好比住八人间。

每个内存单元都有一个编号(相当于宿舍的门牌号),有了这个内存单元的编号,CPU就可以快速找到一个内存空间。

生活中我们把门牌号叫做地址,在计算机中我们把内存单元的编号也称为地址。C语言中给地址起了个新的名字:指针

内存单元的编号==地址==指针

2.如何理解编址 

首先,计算机内有很多的硬件,而硬件单元是要互相协同工作的。所谓的协同,至少相互之间要能够进行数据传递。但是硬件与硬件之间是互相独立的,如何通信呢?答案就是:用“线”连起来(地址总线、数据总线、控制总线)。而CPU和内存之间也是有大量数据交互的,所以,两者必须也用线连起来。

CPU访问内存中的某个字节空间,必须知道这个字节空间在内存的什么位置,因为内存中字节很多,所以需要给内存进行编址(就如同宿舍很多,需要给宿舍编号一样)。计算机中的编址并不是每个字节的地址记录下来,而是通过硬件设计完成的。

硬件编址,32位机器有32跟地址总线,每根线只有两态,表示0,1【电脉冲有无】,那么一根线就能表示两种含义,2根线就能表示4种含义。32根线就能表示2^32种含义,每种含义都代表一个地址。

地址信息被下达给内存,在内存上,就可以找到该地址对应的数据,将数据在通过数据总线传入CPU内寄存器。

二、指针变量和地址

1.取地址操作符(&)

在C语言中创建变量就是像内存申请空间。

 上述代码就是创建整型变量a,创建变量的本质是向内存申请一块空间,为a申请4个字节的空间,用于存放整数10,其中每个字节都有地址。

取地址操作符 - &(单目操作符)

#include<stdio.h>
int main()
{
  	int a = 10;
	printf("%p\n", &a);
	return 0;
}

&a取出的是所占4个字节中地址较小的字节的地址。

虽然整形变量占用4个字节,只要知道了第一个字节地址,就能访问到4个字节的数据也是可行的。 

2.指针变量和解引用操作符(*)

Ⅰ.指针变量
#include<stdio.h>
int main()
{
	int a = 10;
	int* p = &a;
	return 0;
}

p是变量(指针变量),是一块空间,取出的a的地址存储到指针变量p中。指针变量也是一种变量,是用来存放地址的,存放在指针变量中的值理解为地址。

Ⅱ.如何拆解指针类型

p的类型是int*

int a=10;
int* p=&a;

p左边写的是int*,*是在说明p是指针变量,前面的int是在说p指向的是整型类型的对象。

Ⅲ.解引用操作符(*)

在C语言中,我们拿到了地址(指针),就可以通过地址(指针)找到地址(指针)指向的对象,这里就用到了解引用操作符(*),或者叫间接访问操作符。

<