這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,休息一下,下一篇準備接着總結多維數組.