以前學c時,對指針的理解並不怎好,雖然會運用,但其實都是死記硬背,這次重新認真看了一遍終於弄懂了。
(注:有的東西只是爲了便於理解,可能並不準確)
1、指針的理解
在說數組之前還是先說說指針。
看看下面這段代碼:
int a=2;
int *p,*q;
p=&a;
*P=1;
int *p 中 p 是指,找一塊空閒的空間並命名爲p;
int * 是指p裏只能存放int類型變量的地址。
簡單點就是p存放的是地址而非數據。
因此在給p賦值時只能給它地址不能是數據,所以用p=&a。
下面說說*p
*p是指p中的地址指向的變量中的內容(在這個程序中*p就是a中的內容,即“2”);
如果上面這段話不明白,你可以把*p理解爲a的一個別名,
所以對*P賦值也就是對a賦值。
因此給*P賦值時只能給他數據,不能是地址。
這樣理解在運用時就不會把p和*P搞混了。
2、數組
下面說說數組
很多人對數組的理解都是錯的,其實數組就是指針,數組存放的是地址而非數據。
有的人可能對上面這段話不理解,想想我們在用指針表示數組時是怎麼做的
int i[5];
int *p;
p=i;
結合剛剛講的指針,現在就能明白了,
P=i 這裏並沒有取指符號&,因爲數組本身就是指針,指針之間相互賦值當然不用&了。
那麼如何理解i[0]的含義呢?
i[0]=*(p+0)
也就是說i[0]是*(p+0)的一種表示方法,他們兩是一個意思。
弄懂這個你就能理解數組就是指針這句話了(注意,數組存放的只是這組數據的首地址)
這裏有一個有趣的問題,
i[2]和2[i]是否一樣?
根據剛剛說的
i[2]=*(p+2),
2[i]=*(2+p),
*(p+2) =*(2+p)
所以i[2]和2[i]當然一樣了,不信的話大家可以自己編個程序試試。