指針和內存(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章