指针的运算
#include<stdio.h>
int main(void)
{
char ac[] = {0,1,2,3,4,5,6,7,8,9,};
char *p = ac;
printf("p =%p\n", p);
printf("p+1=%p\n", p+1);
int ai[] = {0,1,2,3,4,5,6,7,8,9,};
int *q = ai;
printf("q =%p\n", q);
printf("q+1=%p\n", q+1);
return 0;
}
p =0xbffbad5e
p+1=0xbffbad5f
q =0xbffbad2c
q+1=0xbffbad30
sizeof(char)=1,sizeof(int)=4
#include<stdio.h>
int main(void)
{
char ac[] = {0,1,2,3,4,5,6,7,8,9,};
char *p = ac;
printf("p =%p\n", p);
printf("p+1=%p\n", p+1);
printf("*(p+1)=%d\n", *(p+1));
int ai[] = {0,1,2,3,4,5,6,7,8,9,};
int *q = ai;
printf("q =%p\n", q);
printf("q+1=%p\n", q+1);
printf("*(q+1)=%d\n", *(q+1));
return 0;
}
p =0xbffbad5e
p+1=0xbffbad5f
*(p+1)=1
q =0xbffbad2c
q+1=0xbffbad30
*(q+1)=1
指针的计算
- 这些算术运算可以随指针做:
- 给指针加、减一个整数(+,+=,-+)
- 递增递减(++/--)
- 两个指针相减
#include<stdio.h>
int main(void)
{
char ac[] = {0,1,2,3,4,5,6,7,8,9,};
char *p = ac;
char *p1 = &ac[5];
printf("p =%p\n", p);
printf("p+1=%p\n", p+1);
printf("*(p+1)=%d\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;
}
*p++
- 取出p所指的那个数据来,完事之后顺便把p移到下一个位置去
- *的优先级虽然高,但是没有++高
- 常用语数组类的连续空间操作
- 在某些CPU上,这可以直接被翻译成一条汇编指令
指针的比较
- <,<=,==>,>=,!=都可以对指针做
- 比较他们在内存中的地址
- 数组中的单元地址肯定是现行递增的
0地址
-
当然你的内存有0地址,但是0地址通常是不能随便碰的地址
-
所以你的指针不应该具有0值
-
因此可以用0地址来表示特殊的事情
- 返回的指针是无效的
- 指针没有被真正初始化(先初始化为0)
-
NULL是一个预定定义的符号,表示0地址
- 有的编译器不愿意你用0来表示0地址
指针的类型
- 无论指向什么类型,所有的指针的大小都是一样的,因为都是地址
- 但是指向不同类型的指针是不能互相复制的
- 这是避免用错指针
指针的类型转换
-
void*表示不知道指向什么东西的指针
- 计算时与char*相同(但不相通)
-
指针也可以转换类型
- int* p = &i;void* q = (void*)p;
-
这并没有改变p所指的变量的类型,而是让后人用不同的眼光通过p看它所指的变量
- 我不再当你是int啦,我认为你就是个void!
网友评论