C语言指针——指针运算

指针的运算

通过前面的学习,可以知道指针变量所存储的内容是所指向变量的地址。
那么对指针的加加减减代表的是什么呢?我们可以写段代码康康。

#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地址

指针的类型转换

  1. void* 表示不知道指向什么东西的指针
    计算时与char* 相同(但不相通)
  2. 指针也可以转换类型
int *p = &i; 
void*q = (void*)p;
这并不改变p所指向变量的类型,而是让后人用不同的眼光通过p看它所指的变量
我不当你是int了,我认为你就是个void
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值