指针和内存(02)

day 2

测试环境:Linux 2.6.32-279.el6.x86_64
测试代码:pointer_cal.cpp
#include <stdio.h>

/**
 * test code: pointer_cal.cpp
 * test environment: Linux 2.6.32-279.el6.x86_64
 *
 * 总结:
 * 1. 指针变量进行 +/- 运算时,实际上是指针移动的一个过程
 * 2. 指针在移动的过程中,移动的步长取决于指针被声明的类型的sizeof长度,
 *    而不是指针指向的内存空间所属的变量类型的sizeof长度,
 *    也不是单纯地移动指定的单位的内存地址
 */
int main()
{
    // 声明一个int型的变量 i
    int i = 7;
    // 声明一个int型的指针变量 ip,并取变量 i 的地址并赋值给ip
    // 此时ip中存储的内容为变量i的内存地址
    int *ip = &i;
    // 声明一个char型的指针变量 cip,并取变量 i 的地址进行强制转换成char类型的指针
    // 然后赋值给cip,此时cip中存储的内容为变量i的内存地址
    // @see: http://blog.csdn.net/fawn2315/article/details/48001907
    char *cip = (char*)&i;

    printf("sizeof(int): %d\n", sizeof(int));
    printf("sizeof(char): %d\n\n", sizeof(char));

    printf("&i: %p\n\n", &i);

    // 指针变量被声明为int类型时,则在运算时会根据sizeof(int)的步长来进行移动指针
    // 指针变量被声明为char类型时,则步长会变为sizeof(char)
    // 像下面的指针变量cip,被声明为char类型的指针,虽然其指向的地址存放的数据是属于
    // int型的变量 i的,但是在cip进行运算时是以cip声明时设置的类型(char)的长度为步长
    printf("ip: %p\n", ip);
    ip++;
    printf("ip + 1: %p\n", ip);
    printf("ip + 1 == %p + 1 * sizeof(int)\n\n", &i);

    printf("cip: %p\n", cip);
    cip += 3;
    printf("cip + 3: %p\n", cip);
    printf("cip + 3 == %p + 3 * sizeof(char)\n\n", (char*)&i);

    printf("---------------------------\n\n");

    char c = 'A';
    char *cp = &c;
    int *icp = (int*)&c;

    printf("&c: %p\n\n", &c);

    printf("cp: %p\n", cp);
    cp++;
    printf("cp + 1: %p\n", cp);
    printf("cp + 1 == %p + 1 * sizeof(char)\n\n", &c);

    printf("icp: %p\n", icp);
    icp += 2;
    printf("icp + 2: %p\n", icp);
    printf("icp + 2 == %p + 2 * sizeof(int)\n", (int*)&c);

    return 0;
}
编译 && 执行
g++ -g pointer_cal.cpp -O0 -o pointer_cal
./pointer_cal
执行结果

pointer calculate

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值