第八章 地址指针.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第八章 地址指针

第八章 地址和指针 8.1 变量的地址和指针 a p 2001 一、概念 1、计算机内存是以字节为单位的一片连续的存储空间,每一个字节都有一个编号(称为内存地址) 2、若在程序中定义了一个变量,系统就会根据变量的类型为其分配一定字节数的内存空间,这样变量的内存地址也就确定了,即为该变量所在存储单元的第一个字节地址。 3、程序中对变量的存取操作实际是对某个地址的存储单元进行操作,这里的存取方式有两种: 1)直接存取:直接按变量的地址来存取变量值的方式 2)间接存取:通过一个间接变量p来存放变量a的地址,这样我们要存取a先要找到p的地址,从中找出a的地址,然后再去访问由该地址所指向的存储单元。这里,我们把存放地址的变量p称为指针变量。 4、 说”指针变量p指向了变量a”的含义是指:指针变量p中存放了变量a的地址。 5、在某些场合,指针是使运算得以进行的唯一途径。 二、给指针变量赋值 一个指针变量可以通过不同的方式获得一个确定的地址值,从而指向一个具体的对象。 1、通过求地址运算符()获得地址值 1)单目运算符用来求出运算对象的地址,以此可以把一个变量的地址赋给指针变量。如: int k,*p,*q; p k; 即把变量k 的地址赋予了p, p k 这时可以说p指向了k. 2 ①求地址运算符只能应用于变量和数组元素,不能用于表达式、常量和register变量 ②运算符必须放在运算对象的左边,而且运算对象的类型必须与指针变量的基类型相同 3)在调用scanf函数时,如果有q k;时,那么scanf %d”,k 和scanf “%d”,q 是等价的。 2、通过指针变量获得地址值 1)可以通过赋值运算把一个指针变量中的地址值赋给另一个指针变量,从而使这两个指针指向同一地址,如 p q; 2 当进行赋值运算时,赋值号两边的指针变量的基类型必须相同。 3、通过标准函数获得地址值 即通过调用库函数malloc和calloc在内存中开辟动态存储单元,从而把该存储单元的地址赋给指针变量。 ﹡4、给指针变量赋“空”值 1)除了给指针变量赋地址值外,还可以给指针变量赋NULL值。 如:p NULL;等价于p ’\0’;或p 0; 2)在使用NULL时,应该在程序的前面加预定行: #include . NULL的值为0,当执行了以上的赋值语句后,称p为空指针。 在这里,指针p并不是指向地址为0的存储单元。 8.2、对指针变量的操作 1、通过指针来引用一个存储单元 间接访问运算符(间址运算符)“*”是以单目运算符 1)int *p,i 10,j; p i; 则j *p; j i; j * i ; j *i; 2 *p *p+1; k k+1; ++*p; *p ++; 这里括号不能少 如果写成*p++,则是先将*p作为表达式的值,然后使指针变量p本身加1,指向了下一个存储单元。 m *p++; m *p; p++; k l h j 100 200 300 400 p 3)若有以下定义: int **p,*s,k 20; s k; p s; 则变量p,s和k的关系可用下图表示: p s k 这里的p为指向指针的指针变量。 2、应用举例 用指针指向两个变量,通过指针运算求出值小的那个数。 #include void main int a,b,min,*pa,*pb,*pmin; scanf “%d%d”,pa,pb ; printf “a %d,b %d\n”,a,b ; *pmin *pa; if *pa *pb *pmin *pb; printf “min %d\n”,min ; 以上程序说明当指针指向变量时,完全可以通过指针来对所指存储单元进行存取操作。 二、移动指针 所谓移动指针是指对指针变量加上或减去一个整数,或 通过赋值运算使指针变量指向相邻的存储的单元。注意:只有当指针指向一串连续的存储单元时,指针移动才有意义。 a[0] a[1] a[2] a[3] a[4] 11 22 33 44 55 p q 这里可以有运算:q p+2; p++; q--; q++; 当指针指向一串连续的存储单元时,可以对指向同一串连续存储单元的两个指针进行相减的运算。 比如:q-p 2; *q-*p 33-11 22; 这里的“2”不是指十进制数“2”,而是指的是2个存储单元的长度,至于是多少个字节数,与该指针变量的基类型有关。如p和q的基类型为int型,则对应的一个存储单元长度为4个字节。 当移动指针时,基类型为int 的指针只能用来指向int变量,不能用来指向其他类型的变量,否则,当移动指针时,对于整数“1”,系统将按照基类型来确定移动多少个字节。

文档评论(0)

zong197104 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档