c语言与指针——(一)指针与变量

写在前面:

    指针是学习c语言时,最让人头痛的一个难题。但是指针不仅是c语言的精髓,它还贯穿整个计算机底层存储与访问方式。


一、何为指针?

    指针实际上就 是地址指针变量用来 存放指针(地址)。

    指针变量也是一种变量,它和不同的变量同样要占一定的存储空间。但指针变量与不同的变量不同之处在于,指针的存储空间存放的不是不同的数据,而是一个地址。

    因此,在我们写程序时使用指针时,为了不让自己混淆, 请习惯性将定义指针称为定义指针变量。
 
    指针变量可以操作多种数据结果,使用指针可以操作数组和字符串,可进行函数调用,还可以处理内存地址。


二、指针与变量

    数据在内存中是如何存放的?在机器中, 内存是由一个个内存单元构成的每个内存单元包含8位二进制位,也就是一个字节。 每个内存单元有一个唯一的编号,这个编号称为内存单元地址。而内存单元地址在书写时通常使用16进制来表示,在本质上还是2进制数,只是为了方便书写。

c语言与指针——(一)指针与变量_第1张图片
    上图中,1000H,2000H,2001H......都是地址值,而内存单元内容就是我们所说的变量值。2000H就是一个16进制数,它所对应的二进制数为:0010000000000000.
    内存单元可以一个个使用,也可以一次使用多个连续的内存单元。假设定义了一个变量i,int类型的,我们知道c语言中int类型的大小要看编译环境,我们这里把int类型看做4字节的,32位,那么,i就要占4个内存单元格,假设从2000H开始存储,那么尾地址就是2003H,地址范围就是2000H~2003H,但是我们使用第一个字节的地址2000H作为变量i的地址。那么,计算机在使用变量i时又如何取完四个字节呢?这里就要引入一个偏移量的概念,计算机使用i的内容时,先找到2000H,同时获得它在单元格中还占3个内存单元,而3就是所谓的偏移量。更多偏移量的详解,请自行百度。【偏移量这个概念在计算机是非常重要的】一个变量到底会占几个内存单元是由定义时数据类型确定的,根据数据类型分配一定长度的内存空间。

(1)小案例讲解一

    例如:printf(“%d”,i);的执行过程。现将变量i转换成对应的地址变量,这一步在编译程序时完成,然后根据变量i的地址,假设在2000H找到内存中对应的存储单元,并从中取出数据,最后输出数据。很多编程语言变量的地址是由计算机来分配的,而在c语言中,可以使用区地址运算符&来对变量的地址进行操作。
在程序中,使用的都是变量名,实际上是通过变量名转换成实际地址来操作内存单元的,对内存单元进行读写。

(2)小案例讲解二

    假设i是一个占两个字节的整型变量,而p是一个指向变量i的指针。如下图所示:
c语言与指针——(一)指针与变量_第2张图片
    变量i的地址范围为2000H~2001H,i的数值为1010010001001011。指针变量p也占两个内存单元,地址范围为2100H~2101H,数值为0010000000000000。这里需要强调的是,数值的存储是高字节存储高八位,低字节存储第八位。
仔细查看,指针变量p有自己的内存地址2100H(取首地址为代表地址),而变量p的值却是0010000000000000,那么这个值等于多少呢?换算成16进制,发现,这个值为2000H,正是变量i的地址(取首地址为代表地址)。这样子,我们就将指针变量p和整型变量i连接起来了,通过p就可以找到i,当然先获得的是i的地址, 其次是i对应的内存单元。
    由于通过地址能够找到某个变量对应的内存单元,因此,我们常说指针指向某个变量,而地址也被称为指针,上面的例子,我们就可以称为指针变量p指向变量i。此外,我们关心的是指针变量到底指向的是谁,而不关心指针本身的地址。若有一个指针变量p的地址存放在另一个指针变量q中,那么指针变量q就指向了指针变量p,而指针 变量p指向指针变量i,那么指针变量q就是指向指针的指针变量。

你可能感兴趣的:(数据结构学习)