ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ 指针与整数之间、指针与指针之间的加减运算

2022-09-11 17:31:52  阅读:191  来源: 互联网

标签:指向 susan int ages 加减 C++ mart 指针


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有