总结指针的算术运算

指针的算术运算包括指针与整数的运算和指针与指针的运算两种。

建议看本文之前先对指针的基本概念进行梳理:http://gaozhiyuan.net/c/pointer-introduce.html

指针与整数的运算

为研究指针与整数的运算,我们以顺序存储结构中的数组为例,进行讲解。因为数组在内存中的每个元素单元是连续的,从低地址到高地址,内存编号(指针)增加。

指针+整数

#include <stdio.h>

int main(void) {
    int a[5] = {1, 2, 3, 4, 5};
    int* p = a;
    printf("元素%d的地址是:%p\n",a[0], p);
    printf("元素%d的地址是:%p\n",a[1], p+1);

    return 0;
}

可以看到,指针变量“p”和“p+1”指向的地址相差4,这个4字节即是int类型变量所占用的字节数。

如图:

总结:

  1. 指针与整数的运算不能认为是“地址+1”,而是让指针的地址加上一个“指针所指向的数据类型占用字节数”。
  2. 这里你就应该知道指针为什么要有数据类型了吧。是为了确定指针+1到底是增加多少字节数,如果是int,一般是增加4字节,如果是double类型就增加8字节。移步:为什么指针要有数据类型

指针-整数

#include <stdio.h>

int main(void) {
    int a[5] = {1, 2, 3, 4, 5};
    int* p = a;
    printf("%p\n", p+4);
    printf("%p\n", p+3);

    printf("%p\n",(p+4)-1); //等价于p+3,相当于往左移了一个元素单元
    return 0;
}

 

总结:相当于往左移。

指针与指针的运算

指针-指针

#include <stdio.h>

int main(void) {
    int a[5] = {1, 2, 3, 4, 5};
    int* p = a;
    printf("元素%d的地址:%p\n", *(p+4), p+4);
    printf("元素%d的地址:%p\n", *(p), p);

    printf("%d\n", (p+4)-(p));  //两个指针相减
    return 0;
}

总结:指针与指针的运算并不是两个指针所指向的地址相减。而是指的两者指向的元素相差多少(隔了几个位置)。

指针+指针

指针与指针不允许相加!

指针*指针和指针/指针

这… …你觉得指针和指针相乘和相除代表什么呢??没意义吧~~

显然,都没意义。所以指针与指针的算数运算只能相减,其他的都不可以。

作者: 高志远

高志远,24岁,男生

发表评论

邮箱地址不会被公开。