指针和内存(02)

来源:互联网 发布:如何利用网络做销售 编辑:程序博客网 时间:2024/06/05 15:08

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
原创粉丝点击