首先,先来看一段简单的代码
#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 =0*bffbad5a
p+1=p =0*bffbad5b
q =0*bffbad2c
q+1 =0*bffbad30
可以看到 p+1相比于p地址加1 而q+1却加了4 (2c=44 30=48)
为什么呢?
因为 sizeof(char)=1 sizeof(int)=4
所以当我们对一个指针加一时 并不是在地址上加一 而是加sizeof(类型)的值
#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+1)=1 *(q+1)=1
说明两个指针所在的数组都往后面移动了一个元素 而不是在地址上加一
所以 给一个指针加1表示要让指针指向下一个变量
int a[10];
int *p=a;
*(p+1)--->a[1]
*p++
取出p所指的那个数据来,完事之后顺便把p移到下一个位置去
*的优先级虽然高,但是没有++高常用于数组类的连续空间操作
在某些CPU上,这可以直接被翻译成一条汇编指令
指针计算:
1 给指针加减一个整数
2 递增递减
3 两个指针相减
4 指针不能乘除
两指针相减
若令上述代码中 *p=&ac[0] *p1=&ac[5] 令p1-p 得到 p1-p=5
得到的差值不是地址的差值 而是 地址差值/sizeof 得到是两个指针之间有几个这样的元素在
指针比较
<,<=,==,>,>=,!= 都可以对指针做比较它们在内存中的地址
数组中的单元的地址肯定是线性递增的
两种类型不同的指针不能进行运算
指针的类型转换
void*表示不知道指向什么东西的指针计算时与char*相同(但不相通)指针也可以转换类型
int*p = &i; void*q = (void*)p;
这并没有改变p所指的变量的类型,而是让后人用不同的眼光通过p看它所指的变量
我不再当你是int啦,我认为你就是个void!