指针运算.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文档。上传文档
查看更多
指针运算

指针的算术运算 指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。(指针做的是地址的运算)例如: 例二: 1、int a[20]; 2、int*ptr=a; ... ... 3、ptr++; 在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4。由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。 由于int类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元(即0下标)开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。 我们可以用一个指针和一个循环来遍历一个数组,看例子: 例三: int array[20] ; int*ptr=array; //数组名就是数组空间的起始地址 for(i=0;i20;i++) { printf(“%d ”array[i]); ptr++; } 以上通过对数组的运算实现遍历数组元素。将整型数组中各个单元的值加1。由于每次循环都将指针ptr加1,所以每次循环都能访问数组的下一个单元。 分析一下下面的程序: int main(){ int array[3]={0,1,2} ; int * ptr=array; printf(%d\n,*ptr); // 0 printf(%d\n,(*ptr)++); // 0 printf(%d\n,*ptr); // 1 printf(%d\n,++(*ptr)); // 2 printf(%d\n,*ptr); // 2 ptr++; printf(%d\n,*ptr); // 1 for(i=0;i3;i++){ printf(“%d ”,array[i]); //2 1 2 } } 数组变成{2,1,2},通过这个例子想让大家区分 (*ptr)++与ptr++的区别: (*ptr)++是对数组元素做运算 ptr++是对指针值做运算 这也提醒我们使用指针操作我们的数据时,有时候可能会错误的修改了我们的原始数据。所以,const关键字就对我们的数据起到了保护作用。 再看例子: 例四: 1、int a[20]; 2、int*ptr=a; 3、ptr+=5; 在这个例子中,ptr被加上了5,编译器是这样处理的:将指针ptr的值加上5乘sizeof(int),在32位程序中就是加上了5乘4=20。由于地址的单位是字节,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说,向高地址方向移动了20个字节。在这个例子中,没加5前的ptr指向数组a的第0号单元开始的四个字节,加5后,ptr已经指向了数组a的合法范围之外了。虽然这种情况在应用上会出问题,但在语法上却是可以的。这也体现出了指针的灵活性。 (补充:C语言 不检查数组越界问题,所以需要我们编程的时候自己注意,否则,出现的结果是不可知的) 如果上例中,ptr是被减去5,那么处理过程大同小异,只不过ptr的值是被减去5乘sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。 总结一下,一个指针ptrold加上一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。 一个指针ptrold减去一个整数n后,过程同上。只是ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。 运算符和* 这里是取地址运算符,*有些书上叫做间接运算符。 int a;int *p; a的运算结果是一个指针 指针p的类型int*, 指针所指向的类型是int, 指针所指向的地址,那就是a的地址。 *p的运算结果由它的指向决定。总之*p的结果是p所指向的东西,这个东西有这些特点:它的类型是p指向的类型,它所占用的地址是p所指向的地址。 例五: int a=12; int b; int * p; int **ptr; p=a; //a的结果赋值给p

文档评论(0)

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

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

1亿VIP精品文档

相关文档