標籤:指標 c語言 儲存 記憶體
因為某些原因來好好的將C重新梳理一遍,過去一年也是個渣,好在還能重新來過。將C和指標中指標一節學習了三四次,再將後面的習題做了一做。現在再好好回顧一下。至於對錯就不過多評價。
指標的確是C的特點之一,從最初接這玩意就沒把它弄的很明白。據說把它真正吃透的人也不多。這也只是我的學習筆記。指標,記得當初C語言老師說的一點,就是地址,其他就沒啥印象了。自從自己做題就是記住了這點,指標就是地址,訪問相應記憶體空間的值是間接訪問,要用‘ * ’,也叫解引用指標。
通過C和指標這本參考書,我才知道我們是用變數來代替地址,也就是我們口中的變數。硬體依舊通過地址訪問記憶體位置。相應記憶體空間儲存的值得類型也並非值本身所固有的一種特性,而是取決於他的使用方式,這是隱式的決定方式。
在使用指標前,必須將其初始化,這是通過& 操作符完成的。不然就應該將其初始化為空白指標即NULL。這樣做的好處是防止指標未初始化會造成的未知錯誤。
另外需要注意一點,變數的值就是分配給該變數的記憶體位置所儲存的數值,即使指標變數也不例外。例如
int a;//假設a 的地址為100int *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 的值。
學習筆記:指標之C