指针的运算
通过前面的学习,可以知道指针变量所存储的内容是所指向变量的地址。
那么对指针的加加减减代表的是什么呢?我们可以写段代码康康。
#include <stdio.h>
int main()
{
char ac[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
char *p = ac;
printf("ac sizeof = %d\n", sizeof(ac[0]));
printf("p = %p\n", p);
printf("*p = %c\n", *p);//*p-->ac[0]
printf("p+1 = %p\n", p+1);
printf("*(p+1) = %c\n", *(p+1)); //*(p+1)-->ac[1]
int ai[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int *q = ai;
int *q1 = &ai[6];
printf("ai sizeof = %d\n",sizeof(ai[0]));
printf("q = %p\n", q);
printf("*q = %d\n", *q);//*q-->ai[0]
printf("q+1 = %p\n", q+1);
printf("*(q+1) = %d\n", *(q+1));//*(q+1)-->ai[1]
printf("q1 = %p\n", q1);
printf("q1 - q = %d\n", q1-q);
return 0;
}
ac sizeof = 1
p = 0061FF0A
*p = 0
p+1 = 0061FF0B
*(p+1) = 1
ai sizeof = 4
q = 0061FEE0
*q = 0
q+1 = 0061FEE4
*(q+1) = 1
q1 = 0061FEF8
q1 - q = 6
我们可以看到指针q+1实际上是加了4,也就是int型的大小。
所以指针+1实际上是将指针指向下一个数组单元。
两个指针相减比如上面的q1-q,根据输出的结果显示是6,但是用q1的地址减q的地址结果是24,这表示两个指针相减的结果并不是地址相减的值,而是相隔多少个数组单元。
当然指针的加减只有对连续分配的地址空间有意义,像数组这种,不然没什么意义。
*p++
1.取出p所指的那个数据来,完事之后顺便将p移到下一个位置
2. * 的优先级虽然高,但是没有++高
3. 常用于数组类的连续空间操作
4. 在某些CPU上,这可以直接被翻译成一条汇编指令
指针比较
<,<=,==,=>,!=都可以对指针做
比较它们在内存中的地址
数组中的单元的地址肯定是线性递增的
0地址
内存中有0地址,但是0地址通常是个不能随便碰的地址
所以指针不应该具有0值
因此可以用0地址来表示特殊的事情
返回的指针是无效的
指针没有被真正初始化(先初始化为0)
NULL是一个预定义的符号,表示0地址
有的编译器不愿意你用0表示0地址
指针的类型转换
- void* 表示不知道指向什么东西的指针
计算时与char* 相同(但不相通) - 指针也可以转换类型
int *p = &i;
void*q = (void*)p;
这并不改变p所指向变量的类型,而是让后人用不同的眼光通过p看它所指的变量
我不当你是int了,我认为你就是个void