七、指向数组的指针.pptVIP

  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文档。上传文档
查看更多
七、指向数组的指针 八、二级指针 九、指针数组 十、void 关键字与void *型的指针 七、指向数组的指针 1.指向数组的指针的定义和性质 对于第二个维数相同的二维数组如{int w[3][5],e[6][5];}, w,e共性地具有类型属性int(*)[5],第一个维数3,6协同确定 相应数组的总的内存空间,对于地址的映射计算并不起作 用。通过引进指向列数为5的二维数组的指针x: int (*x)[5]; x可以分别指向w,e。 例如: x=w; x=e+2; 指向数组的指针简称为数组指针,一般地指向二维数组 type d[r][c]的指针定义格式为: type (*q) [c]; 类型 (*数组指针名) [整型常数]; 如上定义的指针q为type(*)[c] 类型的指针,是指向列 数为c的二维数组的指针。 数组指针q是一个指针,因此仅占一个指针对应的存储 空间,其中c是静态的整型常数,用于界定数组指针的步长 增量m = sizeof (type)*c。 一经定义数组指针q,则表达式q[ i ]等价于(*(q+i))为 type*型右值,这个右值是自动计算出来的,不占数据区内 存。 表达式q[ i ][ j ]等价于(*(*(q+i)+j))为type型左值,左值 的内存应预先由数组定义语句分配。编译器不检查q[ i ][ j ] 是否初始化,也不管是否越界。 如果q=d,则可以等价地通过指针名q和二维数组名d来 索引二维数组。此时关系表达式q[ i ]==d [ i ]为真。 在q=d期间q [ i ][ j ]等价于d [ i ][ j ],即对q [ i ][ j ]的操 作就是对d [ i ][ j ]的等价操作,如果q是形参,则形参在函 数中通过q [ i ][ j ]或**q等方式直接操作相应的实参数组。 令n = sizeof (type), m=n*c,q=d的地址为xxxx,则 q+j的地址值为yyyy= xxxx+j*m。 type(*)[c]型指针的位移步长增量为m。q+j的地址属性 为type(*)[c]。 d [ j ]和q [ j ]构成type*型的右值,其步长增量为n。 q[ j ]的地址为yyyy,则 q[ j ]+k的地址值为yyyy+kn, 即指向第j+1行的第k+1个元素,也就是指向 q[ j ][ k ],即关 系式q[ j ]+k==q[ j ][ k ]为真。 q[ j ]或(*(q+j))与q+j具有相同的地址值但地址类型属性 不同。 这里访问指针运算(*(q+j))或q[j]表示降维处理即将 type(*)[c]型的地址降为type*型的右值地址和自动的寻址计 算而不表示直接索引内存数据,只有左值才访问操作内存数 据。 d+j表示指向第j+1行,d[ j ]是第j+1行的首地址,两者 都指向同一内存位置但地址属性不同。 赋值语句{ q=d; q+= j;}导致q的值为xxxx+jm,此时表 达式q[0][k]等价于 d[j][k],**q= q[0][0]=d[j][0]。 d[0][0]总是索引数组d的第1个元素,q[0][0]未必。q++ 向前移动一个位移步长即q从当前位置向后移动m个字节, 也就是值向下一行的内存地址。 指针只能用相同属性的地址赋值,当指针不平级时,需 要进行指针类型转换。语句: double d[3][5]; double (*q)[5]=d+1; double *p=q[0]; 定义数组指针q,初数化指向二维数组d的第2行,*q和 d[1]为double *型的右值地址。d, q具有double(*) [5] 类型 属性,d=q是错误的,d为右值,q为左值。 q- = 1; //向前移动1个double[5]类型的步长,即前移5*8*1=40个字节. 语句{double(*r)[2];}定义double(*)[2]型的数组指针 r,r与q类型属性不同,它们之间不能相互赋值。r=d,q=r是 错误的,等号两边的类型属性不同。r[ j ][ i ]=d[ i

文档评论(0)

38号店铺 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档