day 2
测试环境:Linux 2.6.32-279.el6.x86_64
测试代码:pointer_cal.cpp
/**
* 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.youkuaiyun.com/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
执行结果
