- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第六章 指针
一、变量的地址和指针
(一)变量的地址
1、内存地址:计算机的内存是以字节为单位的一片连续的存储空间,每一个字节都有一个编号,这个编号就称为地址。
例如:一台计算机内存为512MB=512*1024KB=512*1024*1024B,即共有512*1024*1024个地址。
(1)内存空间都是连续的,故地址编号也是连续的。
(2)定义变量后自动分配相应的内存空间。
例如:int a;自动分配4个字节的内存空间给变量a。(画图说明:1011、1012、1013、1014)
(3)每个变量的地址是指所占存储单元的第一个字节的地址。
例如:上例中变量a的地址为1011。
2、直接存取方式:直接按变量的地址存取变量值的方式。
例如:int a;a=5;为变量a分配内存空间,进而变量a有了对应的内存地址,将5赋值给变量a,即将5存入变量a对应的内存空间。看似对变量a赋值,实际上是对变量a对应的内存空间存放数值。
3、关于地址的形象认识:
打个比喻:内存好比就是一个公司的行政大楼,内存当中的每一个字节就好比是大楼中的每一个房间,每一字节内存都有编号,即内存地址,就好比是房间的门牌号。我们定义一个变量a就要为这个变量a分配内存空间,就好比是公司成立一个财务科就要为这个财务科分配房间。将5赋值给变量a就好比是要将一大摞钱送到财务科,实际上就是将钱送到财务科所在的那个房间,同理也就是将5存放到变量a对应的内存空间,而具体怎么由变量a找到其对应的内存空间,是由计算机完成的,因为a的内存空间的分配就是计算机完成的。就好比是我们要找财务科,如果不熟悉地方的话,就问公司内部人员,他会告诉你房间号,同理计算机就如同公司内部人员,它就会告诉5怎么找到变量a的内存空间,即a的地址。通过变量a对其内存空间进行存取数据的方式称为直接存取。
(二)指针变量的定义
1、间接存取方式:我们定义一种变量,这种变量是专门用来存放某种内存地址的。比如我们定义变量p,计算机就为它分配内存空间,就当然有地址(假如为9257)。将变量a的内存地址(1011)存放到变量p中,此时我们要访问变量a所代表的存储单元,我们可以先找到变量p的地址(9527),从中取出a的地址(1011),然后再去访问1011为首地址的存储单元。这种方式就称为“间接存取”方式。
(1)一旦变量p存放了变量a的地址就称变量p指向变量a。此时变量p称为指针(地址)变量,它与变量a不同,它是用来存放指针(即地址)的变量。
(2)任何类型的指针变量均占4Bytes。
2、指针变量定义:类型名 *指针变量名1,*指针变量名2,…;例:int *p,*q;
(1)p、q为用户标识符,*为说明符,不可省略,否则就不是指针变量而为普通变量了。
(2)int为类型名,说明p和q是两个指向整型变量的指针,即变量p和q只能存放int类型变量的地址。称int是指针变量p和q的“基类型”。
(3)二级指针:类型名 **指针变量名1,**指针变量名2,…;例:int **p;
二级指针变量就是其中存放的是指针变量的地址。例如:定义一个int变量k,其内存空间为(2012、2013、2014、2015),再定义int *s;s的地址为9521,但是其指向2012,即其中存放的内容为2012,再定义二级指针:int **p;p地址为4567,它指向9521,即p对应的内存空间存放的是指针s的地址,即指针的地址,称为二级指针。(画图阐述)
二、指针变量赋值及运算
(一)指针变量赋值
1、通过求地址运算符“”给指针变量赋地址值:利用“”运算符把一个变量的地址值赋给指针变量。例如:int a=10,*p,*q;p=a;表示将a的地址赋给了p,我们就说p指向了变量a。(回忆scanf)
(1)求地址运算符可用于变量(包括指针变量)和数组元素,但不可用于表达式、常量。因为表达式、常量无内存分配单元;
(2)求地址运算符只能放在运算对象的左边;
(3)右边的运算对象的类型必须与被赋值的那个指针变量的基类型是严格相同的。
(4)理解:把(int *)理解为一个类型,这样的话对于上例,若是p=a;则错了,因为a是int型的,而p为(int *),而在a右边加上就可赋给p了,也就是说在int类型变量右边加上则变为了(int *),同理float变量右边加上则变为(float *)类型。那么在(int *)指针变量右边加上则变为(int **)类型(二级指针)。而事实上,不存在(int *)和(int **)类型。
2、通过其他指针变量获得地址值:类型相同的指针变量之间可以相互赋值,从而使两个指针变量指向同一地址。例如:int *p,*q,a;p=a;q=p;p和q指向同一个变量。(强调:赋值号两边的指针变量的“基类型”必须相同。)
3、通过标
原创力文档


文档评论(0)