更多课程 选择中心

C/C++培训
达内IT学院

400-996-5531

C指针——指针的算术运算

  • 发布:C++培训
  • 来源:资料库
  • 时间:2020-10-21 14:55

指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的,以单元为单位。

例如:

char a[20];

int *ptr=(int *)a; //强制类型转换并不会改变a 的类型

ptr++;

在上例中,指针 ptr 的类型是 int* ,它指向的类型是 int ,它被初始化为指向整型变量 a 。接下来的第3句中,指针 ptr 被加了1,编译器是这样处理的:它把指针ptr 的值加上了 sizeof (int) ,在32位程序中,是被加上了4,因为在32位程序中,int 占4 个字节。

由于地址是用字节做单位的,故 ptr 所指向的地址由原来的变量 a 的地址向高地址方向增加了4 个字节。由于 char 类型的长度是一个字节,所以,原来 ptr 是指向数组 a 的第0号单元开始的四个字节,此时指向了数组 a 中从第4号单元开始的四个字节。我们可以用一个指针和一个循环来遍历一个数组。

看例子:

int array[20]={0};

int *ptr=array;

for(i=0;i<20;i++)

{

(*ptr)++;

ptr++;

}

这个例子将整型数组中各个单元的值加1。由于每次循环都将指针 ptr 加1个单元,所以每次循环都能访问数组的下一个单元。

再看例子:

char a[20]="You_are_a_girl";

int *ptr=(int *)a;

ptr+=5;

在这个例子中,ptr 被加上了5,编译器是这样处理的:将指针 ptr 的值加上5 乘 sizeof (int) ,在32位程序中就是加上了5 乘4=20。由于地址的单位是字节,故现在的 ptr 所指向的地址比起加5后的 ptr 所指向的地址来说,向高地址方向移动了20 个字节。

在这个例子中,没加5前的 ptr 指向数组 a 的第0号单元开始的四个字节,加5后,ptr 已经指向了数组 a 的合法范围之外了。虽然这种情况在应用上会出问题,但在语法上却是可以的。这也体现出了指针的灵活性。

如果上例中,ptr 是被减去5,那么处理过程大同小异,只不过 ptr 的值是被减去5乘 sizeof (int) ,新的 ptr 指向的地址将比原来的 ptr 所指向的地址向低地址方向移动了20个字节。

下面请允许我再举一个例子:(一个误区)

#include<stdio.h>

int main()

{

char a[20]=" You_are_a_girl";

char *p=a;

char **ptr=&p;

//printf("p=%d\n",p);

//printf("ptr=%d\n",ptr);

//printf("*ptr=%d\n",*ptr);

printf("**ptr=%c\n",**ptr);

ptr++;

//printf("ptr=%d\n",ptr);

//printf("*ptr=%d\n",*ptr);

printf("**ptr=%c\n",**ptr);

}

误区一:输出答案为 Y 和 o

误解: ptr 是一个 char 的二级指针,当执行 ptr++; 时,会使指针加一个 sizeof(char) ,所以输出如上结果,这个可能只是少部分人的结果。

误区二:输出答案为 Y 和 a

误解:ptr 指向的是一个 char *,类型,当执行 ptr++; 时,会使指针加一个,sizeof(char *)(有可能会有人认为这个值为1,那就会得到误区一的答案,这个值应该是4,参考前面内容 ) , 即 &p+4; 那进行一次取值运算不就指向数组中的第五个元素了吗?那输出的结果不就是数组中第五个元素了吗?答案是否定的。

正解: ptr 的类型是 char ** ,指向的类型是一个 char * 类型,该指向的地址就是 p 的地址(&p),当执行 ptr++; 时,会使指针加一个 sizeof (char*) ,即 &p+4; 那 *(&p+4) 指向哪呢,这个你去问上帝吧,或者他会告诉你在哪?所以最后的输出会是一个随机的值,或许是一个非法操作。

总结一下:

一个指针 ptrold 加 ( 减 ) 一个整数 n 后,结果是一个新的指针 ptrnew,ptrnew 的类型和 ptrold 的类型相同,ptrnew 所指向的类型和 ptrold 所指向的类型也相同。ptrnew 的值将比 ptrold 的值增加(减少)了 n 乘sizeof(ptrold 所指向的类型)个字节。

就是说,ptrnew 所指向的内存区将比 ptrold 所指向的内存区向高(低)地址方向移动了 n 乘 sizeof( ptrold 所指向的类型)个字节。指针和指针进行加减:两个指针不能进行加法运算,这是非法操作,因为进行加法后,得到的结果指向一个不知所向的地方,而且毫无意义。两个指针可以进行减法操作,但必须类型相同,一般用在数组方面,不多说了。

当你还在担心能否就业时,达内学员提前被企业录取;当你转辗于各大招聘会时,达内学员收到了高薪offer;当你在各大招聘网站投递简历时,达内学员中有人一毕业进入五百强名企。所以选择很重要。找C++培训班,选达内就对了。

版权声明:转载文章来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:C指针——细说指针
下一篇:C指针——数组和指针的关系

超全的C语言标识符知识

C指针——指针类型转换

C指针——指针和结构类型的关系

C指针——数组和指针的关系

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省