7.2 指针的算术运算

在 C 语言中,指针的值是一个无符号的整数,它表示一个内存块的起始地址(最低位置的地址)。这个整数可以用如下的运算符进行计算。

能用于指针运算的算术运算符有:

++     // 前置和后置自增运算自减
--     // 前置和后置自减运算
+      // 加法运算,只能和整数相加
-      // 减法运算,只能和整数或同类型的指针(用于计算间隔元素个数)相减。

说明:

  1. 指针的算术运算都是基于其指向数据的类型的运算。指针的加一运算实际得到的地址是原地址加上指向数据占用的字节数。
  2. void* 类型的指针可以指向任何数据类型,但不允许进行算术运算,因为编译器不知道其指向类型的大小。

例如:char* 类型的指针 p1 加一值会真正的加一,因为 p1 指向的类型是一个字节。但 short int *类型的指针 p2 加一时值会加二,因为 p2 指向的类型是二个字节。以此类推。

示例:

// filename: pointer_arithmetic.c
#include <stdio.h>

int main(int argc, char *argv[]) {
    char ch = 'A';
    short int si = 100;
    int i = 999;

    char *pch = &ch;
    short int * psi = &si;
    int * pi = &i;

    printf("pch:%p, pch+1: %p, pch+4:%p\n", pch, pch + 1, pch + 4);
    printf("psi:%p, psi+1: %p, psi+4:%p\n", psi, psi + 1, psi + 4);
    printf("pi :%p, pi+1 : %p, pi+4 :%p\n", pi, pi + 1, pi + 4);

    psi++;
    pch++;
    pi++;

    printf("after: psi++; pch++; pi++;\n");
    printf("pch:%p, psi:%p, pi:%p\n", psi, pch, pi);

    return 0;
}

运行结果:

weimingze@mzstudio:~$ gcc -o pointer_arithmetic pointer_arithmetic.c
weimingze@mzstudio:~$ ./pointer_arithmetic
pch:0x7ffe14fe3529, pch+1: 0x7ffe14fe352a, pch+4:0x7ffe14fe352d
psi:0x7ffe14fe352a, psi+1: 0x7ffe14fe352c, psi+4:0x7ffe14fe3532
pi :0x7ffe14fe352c, pi+1 : 0x7ffe14fe3530, pi+4 :0x7ffe14fe353c
after: psi++; pch++; pi++;
pch:0x7ffe14fe352c, psi:0x7ffe14fe352a, pi:0x7ffe14fe3530

使用场景:

指针的算数运算对操作内存连续的多个数据的时候非常实用,比如对数组(后面会学)的数据元素进行操作是非常方便。对非数组类型的指针进行算术运算虽然语法允许,但通常很危险且容易出错。

实验:

编写程序练习指针的算术运算。