- 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、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)