秒懂地址与指针的关系

您所在的位置:网站首页 博客地址是啥 秒懂地址与指针的关系

秒懂地址与指针的关系

2023-08-30 07:47| 来源: 网络整理| 查看: 265

计算机的内存被划分为一个一个小的空间,每一个空间都被编上了编号。这种编号被称为地址。

现在摆在我们面前有两个问题

如何给编号,给什么样的编号呢?即如何编址?一个空间要给划分多大呢? 如何产生地址

我们在日常中经常说,我这个电脑是32位的,我这个电脑是64位的。

这里的32位和64位分别指的是,有32根地址线和64根地址线。

地址线就像电线,一旦通电里面的电流就有正负电之分。用1代表正电,0代表负数。

以32位为例,会产生如下可能

00000000000000000000000000000000 00000000000000000000000000000001 00000000000000000000000000000010 ... 01111111111111111111111111111111 10000000000000000000000000000000 ... 11111111111111111111111111111111

总计产生232个二进制序列。也就是232个编号。这些编号就是内存中的地址。

一个内存单元多大

如果一个内存单元是1bit,那么之前说32位系统。会有232个编号,也就是232个内存单元。232个比特位用计算器算一下为4294967296bit。4294967296bit经过换算是0.5GB内存空间。可是我们买电脑都是8G内存起步啊?一个内存空间是1bit大小,还是不太合适。

那如果一个内存单元是1byte呢?1byte=8bit,比上一个猜想大了八倍,4GB内存空间,这样结果就合理多了。

而事实上一个内存地址空间也确实占用1byte。

查看数据的地址

&叫取地址符,能查看地址。

int main() { int a = 10; printf("%p\n",&a); return 0; }

运行结果 在这里插入图片描述 这个008FFE9C就是地址换算成二进制是1000 1111 1111 1110 1001 1100

地址的存放

有一种变量是用来存放地址。这种变量叫做指针变量。

定义指针变量,比如定义整型a的指针变量。

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

p是个指针变量,p = &a,那p的类型是什么呢?是int*。

就如同定义整型变量a时要写int一样。要让p存放整型变量a的地址,p的类型要写成int*,即p是个指针变量它的类型是int*。

可以验证一下

int main() { int a = 10; int* p = &a; printf("%p\n",&a); printf("%p\n", p); return 0; }

运行结果 在这里插入图片描述 现在p中已经存放了a的地址。我们把a的地址存放到p中,就是为了以后通过地址找到a。那么怎么找呢?

* ———— 解引用操作符

这个星号就是解引用操作符,将它加到p的前面,就是对p进行解引用操作,找到p存储的地址所对应的对像a。

不妨做个测试,既然*p就是对p进行解引用操作找到它存储的地址所指的对像a。

那么对*p赋值20,看看a的结果改变没有。

int main() { int a = 10; int* p = &a; *p = 20; printf("a = %d\n", a); return 0; }

运行结果 在这里插入图片描述

指针变量的大小

我们知道之前创建整型变量a占用四个字节,那指针变量p多大?占几个字节?

这个问题应该这样思考,指针变量中存放的是地址,地址是如何产生的?地址其实就是32位的二进制序列。32位等于4字节。所以在32位系统中指针变量占4字节。

那么如果是64位机器,是有64个地址线的,每根地址线都能产生0,1,那就是64位0与1组成的二进制序列,如果要存起来就是64个比特位的空间也就是8个字节。所以64位系统中指针变量占8字节。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3