初识C语言--指针篇(5)

发布于:2022-11-27 ⋅ 阅读:(627) ⋅ 点赞:(0)

1、初识指针

要知道指针首先得理解内存。内存是电脑上特别重要的存储器,计算机中程序都是在内存中运行的,所以未来有效使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是一个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行编号,这些编号被称为该内存单元的地址

    在我们生活中,电脑都是8G或者16G的内存,这些内存有什么用呢?程序运行的时候会载入内存,程序中如果如果有数据需要存储,也会申请内存空间。那我们怎么知道程序运行的时候会载入内存呢?我们只需要打开电脑的任务管理器(Ctrl+Alt+Del),瞧,是不是每个程序都会占用内存呢。

        既然电脑都是8G或者16G的内存,这么大的内存空间,我们应该如何有效的使用内存呢?

首先内存就像我们生活中的房楼,一栋楼再划分一个一个的房间,每个房间再编个号,随后就可以通过门牌号来找到对应的房间,这样一来一栋楼管理起来就非常的方便。

        内存其实也参考了这样的思路,假设这是个内存块,我们把内存也划分小的内存单元,同时再给每个内存单元进行编号,未来想要找到内存单元,通过内存编号就可以很快定位到。在实践中,一个内存单元大小是1个字节。

        仿照生活中,门牌号在前面加上xxx市xxx区,这不就成为了一个地址了吗。一个地址很好的找到一个房间,其实在内存中,我们也可以把内存单元编号称为地址。在C语言中,我们把地址叫做指针,指针也能叫做地址。接下来的问题来了,如果访问一个内存单元,那内存单元的地址(指针)如何产生呢?

        其实电脑有32位机器,还有64位机器。以32位机器为例,32位机器其实有32根地址线,而地址线如果通电,电信号转换数字信号就是0(低电平)和1(高电平)。32根地址线就会产生32位二进制序列。如下图:

 然后,我们把这些二进制序列与内存单元编号进行一一对应(进制的转换我相信作为一个程序员都可以很了解吧)

所以,32根地址先能产生2的32次方个二进制序列,就可以作为2的32次方个地址,就可以管理2的32次方个内存单元,也就是2的32次方个字节的内存空间。那么问题来了,2的32次方的字节有多大呢?这就要牵扯到C语言的单位

1KB  = 1024byte

MB = 1024 KB

GB = 1024 MB

 2的32次方除以1024可以换出一个KB,再除以1024换出1MB,再除以1024换成1GB,最后换算出2的32次方字节等于4GB

         

接下来我们来看看C语言中的指针是什么

假如我创建变量a=10,这个变量a=10其实向内存申请4个字节(这个在前面讲过如何计算数据类型的大小)

假设绿色为a所申请的四个字节,这四个字节都应该有地址,地址的二进制序列描述的太复杂,所以我们把二进制转换为16进制。这里我们普及一下进制

二进制中:0~1

八进制中:0~7

10进制:0~9

16进制:0~9   a      b     c     d     e    f

                       10   11   12   13   14  15  

        接下来我们打印变量a的地址

这里我给大家总结一下常见的
%c - 字符
%s - 字符串
%d - 打印10进制
%f - float浮点数
%lf - double浮点数
%p - 打印地址
%x - 以16进制来打印

我们再回头看,a的地址不应该有4个地址吗,可程序运行起来只有一个地址在屏幕上打印,这是怎么回事呢?我们来研究一下,首先按下F10,然后再根据一下步骤,找到内存

点开就会出现下面这个界面 ,然后在地址一栏输入&a

 回车一敲

 

有没有发现我们打印是a所占内存空间4个字节中第一个字节的地址。

讲了这么多,指针应该怎么用呢?看看下面的代码,我来讲解一下

在这段代码中,我们使用一个变量pc来存放a的地址,而地址又叫指针,所以在C语言中,把pc叫做指针变量(指针变量是存放指针的变量)。那么指针类型应该怎么写呢?pc前加个“ * “告诉我们pc是个指针变量,而pc指向的是a,a的类型为int,所以把int写在*pc就行了,最后因为pc内存的就是&a,所以最后打印的结果就是一样的。

那还有一个问题,pc内放的就是个地址,我们怎么通过pc来找到a呢?看看下面代码

 这个*pc就是解引用,它的作用就是通过pc的地址来找到a(地址是不能改的),*pc就是a。随后我对篡改它的值,自然而然再屏幕中打印的就是篡改之后的值了。

 2、指针变量的大小

我们应该如何计算一个指针的变量大小呢?

有没有人感到疑惑,变量b是int类型,计算出来的4还能理解,但变量a是char类型,怎么可能是4呢? 其实指针变量大小取决于它存的是什么,与所指向类型无关。

指针变量大小是多少呢?

指针变量存放的是地址

地址:

32位机器上:是32个bit位         --x86是32位环境

32位机器上,指针变量存放的是32bit的地址

32位机器上,指针变量的大小是4个字节(1 字节 = 8 bit)

同理                                          --64是64位环境  

64位机器上:是64个bit位             

64位机器上,指针变量存放的是64bit的地址

64位机器上,指针变量的大小是8个字节

假设我们调x64结果会不会是8呢?我们来看看

当然,结果已经很明显了。 

今天就讲到这里。

下期预告:指针在结构体中的使用

本文含有隐藏内容,请 开通VIP 后查看