C和指標 (pointers on C)——第六章:指標(上)

來源:互聯網
上載者:User

標籤:c   指標   記憶體   

第六章 指標


這一章,就明顯觸痛初學者敏感之處了。我也是在一段時間不用C以後就會對這一部分生疏,好吧,其實是對進階指標那塊生疏。
當然這一部分總有很多借鑒之處,比如數組範圍的問題等,要不我也不會大夏天的這麼虐自己看這種書。


總結:
指標變數的值並非它所指向的記憶體位置所儲存的值,而是儲存了指向的變數的地址。需要通過間接訪問符*來訪問指向的變數的值。
單單聲明一個指標,而並不進行初始化,是不會分配記憶體的。所以在指標執行間接訪問之前,指標必需進行初始化。
要麼指向某個變數、要麼去malloc一個記憶體。
NULL指標就是不指向任何東西的指標。除了NULL指標之外,再也沒有任何內建的記法標識指標常量。除非是用 volatile 0x00...這麼命名,這在現在PC系統看來是不可想象的。在極少見的情況下,我們偶爾需要用到指標常量。
指標可以作為一個左值來用,因為指標標識了一個特定記憶體位置。
比如: ptr = ¶  
          *ptr = para;
在指標值上可以執行一些有限的算術運算。你可以把一個整型值加到一個指標上,也可以從一個指標減去一個整型值。在這兩種情況下,這個整型值會進行調整,原值將乘以指標目標類型的長度。
需要注意的是,指標的大小就是一個位元組,因此對一個指標加1,讓它指向下一個空間,這與該指向的變數是float double沒有半毛錢的關係。
指標間的相互運算,只有用於數組之中其結果才是可以預測的,對於那些非數組元素的運算,最好不要去用,肯定是非法的,只不過IDE沒有報錯。
當減法的時候,如果指標指向數組首元素之前的位置,非法。
當加法的時候,如果指標指向數組末元素之後的一個位置,合法,但再往後,非法。一般不要觸碰這個底線。
如果兩個指標都指向同一個數組的元素,它們可以相減,表示數組中相隔多少個元素。
如果兩個指標不指向同一個數組,那麼它們相減是錯誤的。
關於關係運算,最簡單最常見的是測試它們相等或者不相等。
如果兩個指標都指向同一個數組的元素,那麼它們還可以用>=,>,<,<=這幾個元素。


警告:
1、錯誤地對一個未初始化的指標變數進行解引用。
int *a;
...
*a = 12;
a指向一個位置量,如果a是靜態,那麼它會被初始化為0,如果a是自動的,那麼它不會被初始化,無論哪種情況,僅僅聲明一個指標變數是不會開闢一個記憶體空間。
window比較溫柔,一般就是終止程式,倒黴的時候會產生保護性異常(General Protection Exception)。unix裡面管其叫做 memeory fault,它提示程式試圖訪問一個未分配給程式記憶體的位置。
一定要注意,在調用指標時候,確保它們已經被初始化。
2、錯誤地對一個NULL指標進行解引用。
int *a;
a = NULL;
temp = *a; //wrong!
3、向函數錯誤地傳遞NULL指標。  
這種錯誤純屬活該,在傳遞之前,必需檢測函數的有效性。
4、未檢測到指標運算式的錯誤,從而導致不可預料的結果。
比如:當聲明一個指標的時候,如果已經知道被初始化什麼地址了,就初始化,否則就初始化為NULL,這是個好事,大大節省調試時間。
5、對一個指標進行減法運算,使它非法地指向了數組第一個元素的前面的記憶體位置。
見上!


編程提示:
1、一個值應該只具有一種意思。
2、如果指標並不指向任何有意義的東西,就把它設定為NULL。


問題?
5、 int i[10];
      int *p = & i[0];
      int offset;
      p += offset ; (a)
      p += 3;         (b)
a/b區別是什嗎?
答:求值過程沒有區別,但是a多一步數組越界的檢查。
6、int array[ARRAY_SIZE];
     int *pi;
     for( pi = &array[0]; pi < &array[ARRAY_SIZE];)
*++pi = 0;
錯誤在哪?
答:目的是將array數組清零,但是array[0]沒有清零,因為++首碼了。同時,多清了一個零,array[ARRAY_SIZE-1]後面一個記憶體空間也被清零了。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.