内存
内存在电脑中是特别重要的存储器,计算机中所有程序的运行都在内存中进行。
这是电脑中的内存,每一个内存单元格对应了一个地址,一个内存单元大小是1字节。
大家看这个内存结构是不是有点像一栋大楼,每一层居住了一户人家,我们要去访问人家的话,就需要这户人家的地址,而一层与一层之间的地址差又是一样的,比如说他是105,上面的就是106 。一个道理,内存在电脑中也是一样的存储形式,这样理解起来会不会轻松一点。
我们再了解一下计算机内存的工作原理。
首先32比特位机是由32根地址线连接的,这些地址线是通电的物理线,正电的话表示的就是1,负电就是0 。用这种原理就可以将电信号转化为数字信息 :1 和0组成的二进制序列。
因此可以管理 2^32个字节单元,换算下来差不多就是4GB大小的空间。
而同理在64位机上就是2^64个字节单元,差不多就是8/16/32GB大小的空间。
指针
比如说 int a=0;对于a这个变量,在内存中需要为它开辟4个字节大小的空间。
按上文所述,要想找到a在内存中的位置,我们可以这样做:
我们用取地址操作符 & 取出a的地址,将其打印出来。%p是专门用来打印地址的。
我们现在想主动找到a的地址, 这里p是用来存放a的地址的,在C语言中叫指针变量。
* 是说明p是指针变量,int 即p指向的类型。
那么有了地址,我们怎么在后面找到它呢?
*p是解引用操作,通过*p就能找到a的地址所在。从而改变a的数值。
我们可以看到,每种指针类型的大小都是一样的,与char 、int 所占内存的大小没有关系。
我们能得出结论:指针是用来存放地址的,指针需要多大空间,取决于地址的存储。
在32位机(X86)上,指针类型大小都是4 , 64位机(X64)上是8 。
结构体struct
结构体把一些单一类型组合在一起,它使得C语言能描述复杂类型。
例如描述一串数字我们可以用long long ,也可以用char 字符串,但是要描述一个集合,比如一个人的基本信息,就不可能只用一个类型,这时C语言允许我们自定义类型去描述他,这就要用到我们的结构体。
例如:描述一本书(书名、书的编号、书的作者)
这样我们就描述了一本书,并将它的各个信息打印出来了。
这里有个结构体中的操作符 ‘.’ 结构变量 . 成员变量
如果用我们今天说的指针的方式表示的话:
如果未给出a的信息,只给出了a的地址,可以用这种方法。
’或者
结构体指针 -> 成员变量