C++ 指针与整数之间、指针与指针之间的加减运算
作者:互联网
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; }
标签:指向,susan,int,ages,加减,C++,mart,指针 来源: https://www.cnblogs.com/smartlearn/p/16684409.html