指针运算
1、1+1=2?
- 给一个指针加1表示要让指针指向下一个变量
int a [10];
int *p =a;
*(p+1)-> a[1]
如果指针不是指向一片连续分配的空间,如数组,则这种运算没有意义
2、指针计算
- 这些运算符可以对指针做:
- 给指针加、见减一个整数(+,+=,-,-=)
- 递增递减(++/—)
两个指针相减
#include<stdio.h>
int main(void)
{
char ac[]={0,1,2,3,4,5,6,7,8,9,};
char *p =&ac[0];
char *p1 = &ac[5];
printf("p =%p\n",p);
printf("p+1=%p\n",p+1);
printf("p1-p=%d\n",p1-p);
int ai[]={0,1,2,3,4,5,6,7,8,9,};
int *q= ai;
int*q1 =&ai[6];
printf("q =%p\n", q);
printf("q1 =%p\n",q1);
printf("q1-q=%d\n",q1-q);
return 0;
}
3、*p++
- 取出p所指的那个数据来,完事之后顺便把p移到下一个位置去
- *的优先级随染膏,但是没有++高
- 常用于数组类的连续空间操作
- 在某些CPU上,这可以直接被翻译成一条汇编指令
4、指针的比较
<,<=,==,>,>=,!=都可以对指针做
比较它们在内存中的地址
数组中的单元的地址肯定是线性递增的
5、0地址
- 你的内存中有0地址,但是0地址通常是个不能随便碰的地址
- 所以你的指针不应该具有0的值
- 因此可以用0地址来表示特殊的事情:
- 返回的指针是无效的
- 指针没有被真正初始化(先初始化为0)
- NULL是一个预定定义的符号,表示0地址
- 有的编译器不愿意你用0来表示0地址
#include <stdio.h> int main (void) { char ac[] = {0,1,2,3,4,5,6,7,8,9,-1}; char *p = &ac[0]; int i; for (i=0;i<sizeof(ac)/sizeof(ac[0]); i++){ printf("%\n",ac[i]); } for (p=ac;*p!=-1;){ } while (*p !=-1){ printf("%\n",*p++); } int ai[] = {0,1,2,3,4,5,6,7,8,9,}; int *q = ai; q =p ; return 0; }
6、指针的类型转换
-
void*表示不知道指向什么东西的指针
-
计算时与char*相同(但不相通)
-
指针也可以转换类型
-
int*p=&i;void*q=(void*)p
-
这并没有改变p所知的变量的类型,而是让后人用不同的眼光通过p看它所知的变量