關於C++指針的研究

    這2天,爲了應付實習公司的面試,要求我在windows下寫一個俄羅斯方塊出來

    以前用j2me寫過一個俄羅斯方塊,基本算法和數據結構都有一定的考慮了,可動手開寫的時候C++的指針很是把我鬱悶了一陣,特別是關於數組的指針和指針數組等,一多了就攪在一起搞不清楚,昨天花了一下午基本上算是搞懂了,在這裏做個總結,也算是對的起自己一下午的勞動

    int  one[2] ={2,3}

       cout<<one<<&one<<*one<<endl

       得到的結果是0x0013FF34  0x0013FF34  3,這裏 b 和 &b的值是一樣的.

       但是如果用一個指針來指向它,如下

       int * pone =  one;

       cout<<pone<<"  "<<&pone<<"  "<<*pone<<"  "<<endl;

       得到的結果是0x0013FF34  0x0013FF3C  3, pone和&pone就不一樣了,如我們所期待的一樣.

       這裏就可以得到一個結論,打印數組名得到的是數組的起始地址,而打印&數組名得到一樣的結果.但是這不能理解成 one = &one.我們可以用如下方式證明:

       pone = one ;//success

       pone = &one; //failed,因爲&one 實際是一個 int (*)[2]指針,它不能轉換成int *.

       pone = *&one;//success

       這樣,我們可以知道&one 是一個int (*)[2]指針,*&one則是一個int* 指針,**&one則會得到3,因此,我們還可以使用*&one[0] 來訪問one[0],*&one來訪問one[1];

       現在,我們來定義一個int (*)[2] 的指針,如下:

       int (*ppone)[2] = &one; //success

       cout<<ppone<<"  "<<&ppone<<"  "<<*ppone<<"  "<<**ppone;

       輸出如下:0x0013FF34  0x0013FF30  0x0013FF34  3,這裏我們可以看到,ppone 與 &ppone 也是不相同的,  但ppone 與 *ppone相同,這是爲什麼呢?我猜想可能是因爲ppone = &one,而*ppone = *&one = one,而前面我們已經看到one 和 &one 的輸出是一樣的,因此這裏ppone 和 *ppone也得到了一樣的輸出,但是要注意它們2個一個是int (*)[2],一個是int *,是不一樣的. 

      最後我們看一下

      cout<<&ppone[0]<<&ppone[1];

      輸出爲  0x0013FF34  0x0013FF3C,這是因爲ppone是一個int (*)[2],因爲它每次加1都要跨越2個int的長度.

       ok,休息一下,下一篇準備接着總結多維數組.

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