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.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
執行結果