【C语言】指针

【C语言】指针,第1张

【C语言】指针

提到指针,首先要认识内存。

组装电脑时需要插入内存条,这是电脑必不可少的硬件。内存的作用是存储数据,我们在编程中创建的变量都是放在内存中的。

常见的内存条,有8G,16G等等。那么大的一块空间是如何管理的呢?内存被划分为一个个很小的内存单元,每个内存单元大小是一个字节,并且对应一个编号。

那么编号是怎么产生的呢?现在电脑常见的配置有64位机器和32位机器。这里的64和32指的是地址线的条数,每条地址线可以产生高电势和低电势,对应着二进制中的1和0。以32位机器为例,32位机器可以产生的编号包括32位全0到32位全1的总共2^32次方个二进制数。64位机器同理。

这里的编号就是传说中的地址!

再来梳理一下。内存是一个存储器,分为一个个很小的内存单元,每个内存单元大小是一个字节,并且唯一对应一个由32(64)跟物理线产生的二进制编号,这个编号就是地址!

这就很容易理解后面会讲到的指针变量的大小:32位机器的地址(也就是刚刚讲到的编号)是32位的0/1序列,比如10000100101011110100001010111101(我随便敲的,总共32位,不信的话自己数一下),每个0或者1是一个比特(bit),因为比特是计算机单位中最小的,一个二进制位(0/1)就是一个比特。所以,32位机器的地址大小就是32比特,也就是4个字节。同理64位机器的地址就是64比特,也就是8个字节。这里没看懂的可以倒回去反复看一下,看懂了的话再继续。

在C语言提供的 *** 作符中,有一个是&。这个 *** 作符非常常见,比方说我们写scanf函数时会用到。&的作用就是取地址。用法非常简单,在它后面加上变量名就能取到该变量的地址。比方说:

这就取出了a的地址。

这里需要说明一下,a是int类型,大小是4个字节,也就是需要占用4个内存单元(前面说了一个内存单元大小是1个字节),用&符号取出来的只是第一个内存单元的地址(你只需要把他想象成第一个内存单元的编号就可以了)。

我们还可以把他打印出来,地址的打印格式是%p。 

我们拿到了a的地址后,会想要把它(a的地址)存起来,这就需要定义一个变量。用来存放地址的变量叫做指针变量,也叫指针。所以,我们可以理解成一句话:

指针就是地址!

没错,指针变量,也就是指针,等价于地址,等价于内存的编号,这只是不同的叫法而已,意思是完全一样的。所以不要把指针想的太高大上,他只是一个普普通通的内存的编号而已。

那么指针变量如何定义呢?

很简单,正确的写法如下。

解释一下,这一行代码蕴含着很多的信息。这里定义了一个指针变量,并且赋了初始值。定义的这个指针变量的名字是pa,并且赋值为变量a的地址(可以把&a这个整体看成a的地址)。这里的pa的类型是int*。其中这颗*表示pa是指针变量,而int表示pa这个指针变量指向的对象(也就是a)是int类型的。 这里可以举一反三一下。

这里的*表示pch是一个指针变量。char表示pch指向的对象(ch)是char类型的。

我们拿到了一个变量的地址,就可以通过这个地址来访问这个变量。这里就要介绍另外一个重要的 *** 作符

*

也就是解引用 *** 作符。不要小看这个小小的*(这玩意确实有点小),给他一个地址,它就可以访问这个地址指向的对象。使用起来非常简单,在*后面直接加上指针变量的名字即可。

这里就直接把pa指向的对象a改成了1。

那么指针变量的大小是多大呢?

其实前面已经剧透过了。32位机器是4个字节,而64位机器是8个字节。忘记的可以往上翻看一下。注意:指针变量的大小跟指针指向的变量的大小无关,只跟机器是32位还是64位有关。

下面来验证一下这一点。

这是X86(32位平台)。

这是X64(64位平台)。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5693700.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存