1.指针与整数之间的加减运算:

1)指针加减数字表示的意义是指针在数组中位置的移动; 对于整数部分而言,它代表的是一个元素,对于不同的数据类型,其数组的元素占用的字节是不一样的,
比如指针 + 1,并不是在指针地址的基础之上加 1 个地址,而是在这个指针地址的基础上加 1 个元素占用的字节数: 
1)如果指针的类型是 char*,那么这个时候 1 代表 1 个字节地址; 
2)如果指针的类型是 int*,那么这个时候 1 代表 4 个字节地址; 
3)如果指针的类型是 float*,那么这个时候 1 代表 4 个字节地址; 
4)如果指针的类型是 double*,那么这个时候 1 代表 8 个字节地址。
2)通用公式: 数据类型 *p;
p + n 实际指向的地址:p 基地址 + n * sizeof(数据类型)
p - n 实际指向的地址:p 基地址 - n * sizeof(数据类型)
比如:
1)对于 int 类型,比如 p 指向 0x0061FF14,则:
   p+1 实际指向的是 0x0061FF18,与 p 指向的内存地址相差 4 个字节;
   p+2 实际指向的是 0x0061FF1C,与 p 指向的内存地址相差 8 个字节
2)对于 char 类型,比如 p 指向 0x0061FF28,则:
   p+1 实际指向的是 0x0061FF29,与 p 指向的内存地址相差 1 个字节;
   p+2 实际指向的是 0x0061FF2A,与 p 指向的内存地址相差 2 个字节;

#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
int main() {
    int ages[] = {20,18,19,24,23,25,30,35,32};
    int len = sizeof(ages) / sizeof(ages[0]);

    int* p = ages;
    printf("第七个人的年龄:%d\n",*(p+6)); //*(p+6)相当于ages[6]
    printf("*p+6=%d\n",*p+6); //*p+6相当于ages[0]+6
    printf("*p=%d\n", *p );  //*p相当于ages[0]
    printf("第三个人的年龄:%d\n",*(p+2)); //*(p+2)相当于ages[2]

    int* p1 = &ages[4];

    printf("相对于第5个人,他的前一位的年龄:%d\n",*(p1-1)); //*(p1-1)相当于ages[4-1],即ages[3]
    printf("相对于第5个人,他的前三位的年龄:%d\n", *(p1 - 3)); //*(p1-3)相当于ages[4-3],即ages[1]

    system("pause");
    return 0;
}

2.指针与指针之间的加减法运算
1)指针和指针可以做减法操作,但不适合做加法运算;
2)指针和指针做减法适用的场合:两个指针都指向同一个数组,相减结果为两个指针之间的元素数目,而不是两个指针之间相差的字节数。 比如:
int int_array[4] = {12, 34, 56, 78};
int *p_int1 = &int_array[0];
int *p_int2 = &int_array[3];
p_int2 - p_int1 的结果为 3,即是两个之间之间的元素数目为 3 个。
如果两个指针不是指向同一个数组,它们相减就没有意义。
3)不同类型的指针不允许相减,比如 char *p1; int *p2; p2-p1 是没有意义的。

#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
/*
  使用“指针-指针”的方式计算整数数组元素的偏移值;
*/
int main() {
    int ages[] = { 20,18,19,24,23,25,30,35,32 };
    int ages1[] = {18,19,20,22};
    int len = sizeof(ages) / sizeof(ages[0]);

    int* mart = ages + 6;
    int* susan = ages + 9;

    printf("susan-mart=%d\n",susan - mart);
    printf("mart-susan=%d\n", mart - susan);

    mart = ages + 6;
    susan = ages1 + 3;

    printf("mart:%p susan:%p susan-mart:%d\n", mart, susan, susan - mart);

    system("pause");
    return 0;
}

posted on 2022-09-11 17:18  wshidaboss  阅读(1033)  评论(0编辑  收藏  举报