學習筆記:指針之C

因爲某些原因來好好的將C重新梳理一遍,過去一年也是個渣,好在還能重新來過。將C和指針中指針一節學習了三四次,再將後面的習題做了一做。現在再好好回顧一下。至於對錯就不過多評價。

指針的確是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 的值。

發佈了53 篇原創文章 · 獲贊 6 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章