Loading... # 指针减法 ```C #include<stdio.h> int main(void) { char ai[]={0,1,2,3,4,5,6,7,8,9}; char *p=ai; char *p5=&ai[5]; printf("p = %p\n",p); printf("p5 = %p\n",p5); printf("%d\n",p5-p); int aj[]={0,1,2,3,4,5,6,7,8,9}; int *q=aj; int *q5=&aj[5]; printf("q = %p\n",q); printf("q5 = %p\n",q5); printf("%d\n",q5-q); } ``` ![运行结果](https://blog.fivk.cn/usr/uploads/2021/01/2887700678.png) p和p5相差5,q和q5相差20。 * 指针相减是地址相减再处以sizeof(类型); * 也就告诉了地址中间有这样类型的东西在 指针还可以 :+,+=,-,-=; # *p++ * 取出p所指的那个数据来,完事之后顺便把p移到下一个位置去 * *的优先级虽然高,但是没有++高. * 常用于数组类的连续空间操作 * 在某些CPU上,这可以直接被翻译成一 条汇编指令 ```C #include<stdio.h> int main(void) { char ai[]={0,1,2,3,4,5,6,7,8,9,-1}; char *p=ai; while(*p!=-1){ printf("%d ",*p++); } } ``` ![运行结果](https://blog.fivk.cn/usr/uploads/2021/01/2231753679.png) # 指针比较 * <,<=,==,>,>=,!=都可以对指针做 * 比较它们在内存中的地址 * 数组中的单元的地址肯定是线性递增的 # 0地址 * 当然你的内存中有0地址,但是0地址通常是个不能随便碰的地址 * 所以你的指针不应该具有0值 * 因此可以用0地址来表示特殊的事情: * 返回的指针是无效的 * 指针没有被真正初始化(先初始化为0) * NULL是一个预定定义的符号,表示0地址 * 有的编译器不愿意你用0来表示0地址 # 指针类型 * 无论指向什么类型,所有的指针的大小都 * 是一样的,因为都是地址 * 但是指向不同类型的指针是不能直接互相赋值的 * 这是为了避免用错指针 # 指针类型转换 * void*表示不知道指向什么东西的指针 * 计算时与char*相同(但不相通) * 指针也可以转换类型 * int *p = &i; void*q = (void*)p; * 这并没有改变p所指的变量的类型,而是让后人用不同的眼光通过p看它所指的变量我不 * 再当你是int啦,我认为你就是个void! # 用指针来做什么? * 需要传入较大的数据时用作参数 * 传入数组后对数组做操作 * 函数返回不止一个结果 * 需要用函数来修改不止一-个变量 * 动态申请的内存... 最后修改:2021 年 03 月 14 日 © 禁止转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏