第九章 指针(一)

一、指针的基本概念详解

1、前提知识

在C语言中有很多类型的变量,如全局变量、局部变量,此外还有局部的static变量等,这些变量虽然可以笼统地说它们都是存储在内存中,但是内存也分很多区域,光前面章节讲过的就至少有"静态存储区"和"动态存储区",不同类型变量会保存在不同的存储区里,这是一个问题。

第二个问题就是这些不同种类变量的内存分配时机问题,如果真要详细了解,内容会很烦琐,甚至要详细查阅资料,所以这里只提重要的两点内容:

1)有些变量的内存在程序编译时分配,有些变量的内存在程序执行时分配。

2)不管怎样说,变量是会占用一块内存空间。

每一个变量都有一个类型,如讲过的整型、实型、字符型等这些类型都占用一定内存字节(内存空间),占用的字节数可以用sizeof(类型名)来得到。众所周知,x86平台下,如int类型占4字节,char类型占1字节,float类型占4字节,double类型占8字节等。

2、地址的概念

传统生活中表示一个地址,可以用文字描述:

XX市XX区XX路XX号

这是-堆人类能看懂的文字,这个文字代表一个真实地址,也就是说如果真的按照这个文字去找,能找到个实际的地理位置。

计算机中的地址是其实跟人类社会中的地址很类似,人类社会中是用一堆文字来描述一个地址,而计算机中使用一个数字来描述一个地址,如1000,这是数字(十进制数)这就代表一个地址,只不过计算机更习惯用十六进制的数字形式来表示一个地址(这和人类不一样,人类更习惯看十进制数字),如1000的十六进制是0x3E8(六进制数以0x开头儿)。在计算机中,如果看个地址数字,计算机往往显示出来的是0x3E8,不会显示成1000。但在讲解时,还是会用1000这样的十进制数字来表示一个地址,因为这样方便人类观看或阅读。这个1000就表示一个真实的计算机地址,只要到内存中找这个1000所代表的地址,就真的能够找到。

简单来说,地址在计算机中就是一个数字,代表一个内存位置。

计算机内存中的地址不是杂乱元难,而是有编号的。

如下图(这只是一个示意图,辅助理解)。

可以注意到,这个内存地址也是从上到下从小到大,挨着排列的。每个数字对应一个地址,也就是图中所示的格子。

现在定义了两个整型变量i和j,i给初值5,j给初值6,因为每个变量占4字节内存,假设系统把这段内在分配给了这两个整型变量,也可以看下图分配完之后,内存的样子。

注意到,地址1000-1003分配给了变盘i,地址1004-1007分配给了变量j。内存只有"地址"和"地址中保存的内容"这两个概念,内存本身并不知道i和j这样的名字代表的是什么含义,但在程序内部会维持一张表,这张表会记录变量名和变量地址(内存地址)的对应关系,这样,在编写代码的时候,在源代码中写i,系统就能找到该变量名对应的内存地址以及该内存地址中的内容。

例:

printf("i+j=%d",i+j);

系统执行方式:在系统维持的这张表中找到的地址1000,因为i是整型,所以系统取出1000开始的4字节(1000-1003每个地址保存1字节)内容作为i的值,再找到地址1004,因为j也是整型,所以系统取出从1004开始的4字节(1004-1007)内容作为j的值,然后做两者的加法运算并输出结果。

3、直接访问和间接访问

上面计算i+j的过程,是按照变量的地址存取变量值,这叫屈"直接访问",与"直接访问”相对的叫"间接访问",那么”间接访问"是什么意思?

在C语言中,一般用in、char、float、double这些类型的变量来保存值。那么,也可以定义一种特殊的变量,这种特殊变量专门用来保存地址。假设定义了一个变量mypoint来存放整型变量的地址,请注意,虽然这种特殊变量是用来保存地址的,但它也分保存什么类型变量的地址,这里mypoint是用来保存整型变量地址的。

例:

mypoint=&i;    
//注意这个&,是地址符号
//这就理解成mypoint指向了i,这个所谓指向i,就是通过保存i的地址体现的

虽然这个特殊变量mypoint是用来存放整型变量的地址的,但是mypoint这种特殊变量本身在内存中也是有地址的,所以是占内存的。特殊变量在x86平台一般占4字节内存,在其它平台,如x64平台占8个字节内存。

现在要存取i的值,就有了一种间接访问的手段。先找到存放i的地址的这个内存位置(3000-3003),也就是mypoint的内存地址,从这4字节的内存中取出i的地址(1000)。因为知道mypoint里保存的是整型变量i的地址,而又知道整型变量占4字节,这表示1000这个地址开始的4字节(1000-1003)里面是个整型数据,那从1000开始取得4字节数据,也就是5,就是i的值,这就是”间接访问"一一通过特殊变量mypoint,间接访问了变量i的值。

在掌握了"间接访问"概念后,就可以真正地引人"指针变量"概念,什么叫指针变量呢?

如果一个变量,如这里的mypoint,专门用来存放另外一个变量的地址,则称这个变量为"指针变量"。mypoint就是一个指针变量,指针变量的值(也就是其中存放的值)是一个地址(也有人称为指针)。

这里要仔细区别"指针变量"和"地址/指针"这两个概念,指针就是一个地址(地址是用数字表示的),指针变量是存放其他变量地址的变量,也叫该指针变量指向某某变量(如这里的mypolnt指向i)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值