指針的確是C的特點之一,從最初接這玩意就沒把它弄的很明白。據說把它真正吃透的人也不多。這也只是我的學習筆記。指針,記得當初C語言老師說的一點,就是地址,其他就沒啥印象了。自從自己做題就是記住了這點,指針就是地址,訪問相應內存空間的值是間接訪問,要用‘ * ’,也叫解引用指針。
通過C和指針這本參考書,我才知道我們是用變量來代替地址,也就是我們口中的變量。硬件依舊通過地址訪問內存位置。相應內存空間存儲的值得類型也並非值本身所固有的一種特性,而是取決於他的使用方式,這是隱式的決定方式。
在使用指針前,必須將其初始化,這是通過& 操作符完成的。不然就應該將其初始化爲空指針即NULL。這樣做的好處是防止指針未初始化會造成的未知錯誤。
另外需要注意一點,變量的值就是分配給該變量的內存位置所存儲的數值,即使指針變量也不例外。例如
int a;//假設a 的地址爲100
int *b;
a =120;
b =&a;
printf( "%d %d";a,b);
這樣得到的值是120和100。這時我們也應該牢記指針變量的值就是一個數字,除非有間接訪問操作符,否則我們是不能訪問相應內存空間的值。
在解引用指針前,我們必須要確定相應的指針不是NULL指針,因爲它是不能進行間接訪問的。否則將會引發錯誤終止程序或者訪問內存位置零,引發未知錯誤。
(檢查參數的合法性)
指針常量其實蠻少用,除了極其特殊的情況(你能確定數據的內存位置)。此處應注意,假如知道指針變量確切位置即一整型數值,通過其間接訪問操作話,應強制類型轉化。如
*(int*)100 =5;
就是把值5存儲於內存位置100。
指針的指針話,就應該先把一重指針搞明白後,多看看書,做做練習,對概念才更加深刻。
在學習時,遇到一些很常用的指針表達式。例如
char cp = 'a';
char *cp =&ch;
&ch;
cp;//右值 左值
&cp;
*cp;//<span style="font-family: Arial, Helvetica, sans-serif;">右值 左值</span>
*cp + 1;
*( cp +1 );//右值 左值
++cp;
cp++;
*++cp;//右值 左值
*cp++;//右值 左值
++*cp;
(*cp)++;
//++*++cp;
//++*cp++;
以上未標註的就只有爲右值時合法。
不過正如書的作者所說 這並非讓大家死記硬背,關鍵是讓大家去理解這些表達式的意義。
坦白說我自己還是比較迷糊 不太理解這些表達式 不過忘了多翻翻參考手冊 積累久了就好了。
另外對於指針的運算,指針和一個整數量執行算術運算時,指針的值根據合適的大小進行調整。即指針變化量等於整數量乘以數據類型所佔字節大小(char 1 , short 2, int 4, double 8)。
只有指向同一個數組的指針才能進行減法運算。而其減法運算的結果與數據類型是沒有什麼關係的。減法運算的值是兩個指針在內存的距離(以數組元素的長度爲單位,而不是以字節爲單位),因爲減法運算的結果將除以數組元素類型的長度。例如p1指向array[i]而p2指向array[j],那麼p1-p2的值就是 j - i 的值。