C語言小知識

     .根據函數能否被其他的源文件調用,函數可以分爲內部函數和外部函數兩類:(1)內部函數:在函數的首部的最左端加關鍵字static,則表示此函數是內部函數。內部函數又稱爲靜態函數,只能被它所在的文件中的函數調用,不能被其他的文件中的函數調用。(2)外部函數:在函數首部的最左端加關鍵字extern或者省略關鍵字,則表示此函數是外部函數。


     .作爲一種特殊的變量,指針可以進行一些運算,但是並非所有的運算都是合理的,指針的運算主要侷限在加減算數運算和其他一些爲數不多的特殊運算符上。

(1)算數運算之“指針+整數”或者“指針-整數”。通俗的講,“指針+整數”用於將指針向後移動“sizeof(指針類型)*整數”個內存單元,而指針-整數”用於將指針向前移動“sizeof(指針類型)*整數”個內存單元。

      注意:對指針的算數運算使的指針以某數值爲單位在內存中前後移動,但是編輯器並不檢查這種移動的有效性,即目的的地址是否可用。如果移動失誤,很可能會修改一些本不該修改的內存單元,給程序帶來致命後果。 

     因此,這種“指針和整數的加減運算”適宜在數組中進行,或者是動態申請的內存。

  (2)指針-指針

      指針變量所支持的另一種運算方式是兩個同類型的指針相減,返回值是一個有符號的整數,其值可以用下列公式計算:(指針1的值-指針2的值)/指針所指向類型的佔用的字節數。

    指針相減多應用於同一塊內存(如數組或者一塊動態申請的內存)中。如果兩個指針所指向的元素沒有任何結構上的關係,指針相減的結果將是不可預測的。

   規律:在數組中,在類型正確的前提下,若p1指向sz[i] ,p2指向sz[j],那麼p1-p2=i-j;


    .指針與const

       const取自英文單詞constant,是“恆定、不變”的意思,用戶可以用其修飾變量和函數的參數列表和返回值,限定其不允許改變。使用const在一定程度上可以提高程序的健壯性。另外,在觀看別人的代碼的時候,清晰地理解const所起的作用,對理解程序也有一些幫助。

     使用const修飾指針時,通過在不同位置使用const,可以達到如下三個目的:

    (1)禁止對指針賦值。

    (2)禁止通過間接引用(*指針)對指針所指向的變量賦值。

    (3)既禁止對指針賦值,又禁止通過間接引用(*指針)對指針所指的變量賦值。

     1.禁止改寫指針

     在聲明一個指針時,如果在*右邊加const修飾符,所聲明的指針爲常量指針(常指針),編譯器不允許程序改寫該指針的值。換言之,該指針恆指向某個內存地址,例如:int x=0;    int* const pInt=&x;

    上述代碼聲明瞭一個指向int形變量的指針pInt,並用int形變量X的地址爲其初始化,在整個執行的過程中,pInt的值無法改變,也就是說,用戶無法在後續代碼中讓pInt指向別的內存單元。

     注意:無法改寫pInt的值並不意味着無法通過間接引用改寫pInt所指向的變量。下述代碼是合法的:

      x=5;*pInt=6;

     聲明一個常指針,必須對其進行初始化,因爲常指針的值在聲明完畢後無法修改。因此,未進行初始化的常指針是沒有意義的,編譯器將給出錯誤提示。

    2.禁止改寫間接引用

       在指針申明時,將const修飾符放在指針類型符之前,便無法通過間接引用改寫指針所指向的變量。例如:

    int x=5; const int* pInt=&x;

       與常指針不同的是,此處的pInt並不被禁寫,用戶可以使用pInt指向其他的內存單元。但是,通過間接引用(*pInt)改寫指針所指向的變量是非法的,例如:pInt=10.

      禁止寫間接引用,並不意味着該內存單元無法改寫,通過變量名訪問和改寫該內存區域是合法的。例如:X=10;

   

   四.typedef

C語言提供了一個自定義類型的語句-typedef,它能夠爲某一類型創建新的、方便的、可識別的名稱。typedef和define相似,但typedef給出的符號名稱僅限於對數據類型,而不是對值。

       typedef 原類型名 新類型名;


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章