1. 程式人生 > >C與指標筆記第三章

C與指標筆記第三章

第一節:基本資料型別
C語言僅有四種基本資料型別:
    1.整型
    2.浮點型
    3.指標型別
    4.聚合型別

一.整型(九種)
    1.字元
        char
        signed char 
        unsigned chars
    2.短整型
        signed short int 
        unsigned short int 
    3.整型
        signed int 
        unsigned int 
    4.長整型
        signed long int 
        unsigned long int
        
在16位平臺下省缺int型別為2個位元組,long也為2個位元組        

整型相互之間的大小規則:
    長整型至少和整型一樣長,而整型至少和短整型一樣長。
    
整型在省缺情況下是int型別的。    

省缺的char要麼是signed char,要麼是unsigned char,這取決於編譯器。
    在vs與gcc中,char是signed的。

提示:當可移植性問題比較重要時,最佳的妥協方案就是將char型別限制
    在signed char與unsigned char之間,這樣獲得最大的可移植性(指
    的是都宣告為signed char或是un時),同時又不犧牲效率(有些機器
    在處理unsigned char時效率會受損)。
    
二.浮點型別
1.單精度:float
2.雙精度:double
3.擴充套件精度:long double

ANSI標準規定:
    1.long double至少和double一樣長,double至少和double一樣
    2.標準同時規定了一個最小範圍:所有浮點型最少能容納
    10的-37次方~10的37次方之間的任何值。

浮點數在省缺情況下是double型別的。

三.指標

每個記憶體位置都由地址唯一確定並引用。

四.綜合:常量
1.使用const定義的常量:命名常量(named constanr,宣告為const的變數)
2.使用define巨集定義常量
3.字面值(literal、常量、字面值常量):
    這是一種實體,制定了自身的值,並不允許發生改變
    
(一).整型字面值:編譯器通過字面值的書寫來確定是9種整型型別中的哪一種。
    1.在字元後面新增:
        Uu
        Ll
    2.使用8進位制0ddd
    3.使用16進位制0xddd
在省缺情況下,字面值型別就是(int、unsigned int、long、unsigned long)
中最短但足以容納整個值的型別。
    
    4.字元常量:就是一個用單引號包圍起來的單個字元。
        型別總是int,不能新增unsigned。
    
    5.寬字元型別    
        L'中'

(二).列舉型別:就是它們的值是自定義的符號常量而不是字面值(即不是使用者直接輸入數字賦值的)型別

注意:當然,也可以給列舉型別變數賦值為數字,也可以將列舉型別變數
賦值給其他整型變數。把列舉變數和整數無差別的混合在一起使用,會削弱
它們值的含義。

(三).浮點數字面值:總是寫成十進位制的形式,必須有一個小數或指數。
    3.14159
    1E5 --->100000
    25.
    .5
    6.023e2 ---> 602.3
(四).指標常量(pointer constant):
    指標字面值常量無意義,NULL為特例。


第二節 變數的宣告
    1.變數的定義:說明符(一個或多個) 宣告表示式列表(被宣告的識別符號列表)
        說明符(specisier):包含一些關鍵字,用於描述被宣告的識別符號的基本型別
    2.在宣告變數時,如果宣告中已經至少有了一個其他的說明符,int可以省略。
        signed int ---> int 
        unsigned int ---> unsigned
        signed long int ---> signed long
    3.*操作符執行的是間接訪問操作(indirection),也譯作間接定址
    4.C語言中有幾種宣告,它們的型別名可以省略:
        4.1.函式的省缺返回值型別為int型別。
        4.2引數宣告的型別名省缺為int型別。

        
第三節 C語言中支援一中叫做typedef的機制,為已有的資料型別起別名。
注意:應使用typedef而不是#define來建立新的型別名。
    typedef p_to_char char *;
    p_to_char a, b;
    正確地聲明瞭a,但是b卻被宣告為一個字元。
    #define只是簡單地符號替換。
    

第四節 常量
    可以使用 const關鍵字來宣告常量
    #define指令也是一種建立名字常量的機制
    
    #define的優勢:
        1.只要允許使用字面值常量的地方都可以使用#define;const變數只能用於
        允許使用變數的地方。
        2.使用名字常量定義陣列的長度。
    
第五節 作用域:識別符號宣告的位置決定了它的作用域

編譯器可以確認四種不同型別的作用域:
    1.檔案作用域
        1.1.任何在所有程式碼塊之外宣告的識別符號都具有檔案作用域
        1.2.從宣告之處到原始檔結尾都是可以訪問的
            區域性變數隱藏其作用域除外
            使用#include包含標頭檔案除外
    2.函式作用域
        只適用於語句標籤,語句標籤用於goto語句。
        可以簡化為:一個函式中的所有語句標籤必須為一。
        goto語句不能從一個函式調到另外一個函式中。
    3.程式碼塊作用域
        位於一對花括號之間的所有語句稱為一個程式碼塊。
        在程式碼塊的開始位置宣告的識別符號都具有程式碼塊作用域。
    4.原型作用域
        只適用於在函式原型中宣告的函式。
        唯一可能出現衝突的就是在同一個原型中,不止一次的使用同一個名字。
    
    
第六節 連線屬性(linkage)

一.識別符號的連線屬性決定:如何處理在不同的檔案中出現的識別符號。

二.連線屬性一共有三種:    
    1.external(外部)
        總被當做同一實體
    2.internal(內部)
        同一原始檔中表示同一實體,不同原始檔中表示不同實體。
    3.none(無)
        總被當做單獨的個體
        
三.作用域與連線屬性的關係:
    識別符號的作用域與他的連線屬性有關,但這兩個屬性並不相同,識別符號的
    位置和連線屬性,共同決定了變數的作用域。
    
四.extern 和 static
識別符號extern和static用於在宣告中修改識別符號的連結屬性。
    1.每個宣告具有external連結屬性,加static連線屬性變為internal
    
    2.extern為一個識別符號指定external連結屬性,這隻在第一次宣告中有效,當它
    用於第二次或者以後的宣告時,並不會改變由第一次宣告所指定的連結屬性。
        static int a;
        {
            extern int i;
        }
    
    3.從技術上說,這兩個關鍵字只有在宣告中才是必須的。建議在其他原始檔中的
    宣告中新增extern關鍵字。    
    
    
第七節 變數的儲存型別:是指變數儲存值的記憶體型別。
    一.關係
        變數的儲存型別決定變數:
        1.何時建立
        2.何時銷燬
        3.值儲存多久
    
    二.儲存變數的位置
        1.普通記憶體
        2.執行時堆疊
        3.硬體暫存器
        
    三.儲存型別的分類
        1.自動儲存型別(儲存型別是自動)
        2.靜態儲存型別(儲存型別是靜態)
        3.暫存器儲存型別(儲存型別是暫存器型別)
    
    變數的位置和宣告決定了儲存型別。    
    
    四.變數的省缺儲存型別取決於它的宣告位置:
        1.在代任何碼塊之外宣告的變數:儲存於靜態記憶體中,無法指定其他的儲存型別。
        稱為靜態(static)變數,靜態變數在程式執行之前建立。
        2.在程式碼塊內部宣告的變數:(automatic)省缺儲存型別是自動的,稱為
        自動(auto)變數。關鍵字auto就是用於修飾這種儲存型別的。
        
    五.關鍵字對儲存型別的影響:
        1.static:對程式碼塊內部宣告的變數使用static修飾。
            儲存型別從自動變為靜態。
        2.extern:對程式碼塊內部宣告的變數使用extern修飾。
            儲存型別從自動變為靜態。
        3.register:關鍵字register可以用於自動變數的宣告,提示它們應該儲存
        於硬體暫存器,稱為暫存器變數。
            3.1優勢:
                暫存器變數比儲存於記憶體中的變數訪問起來效率更高。
            3.2機器不提供暫存器變數的地址。    
    
    六.初始化問題:??????????
        靜態變數:
            1.不指定初始值,初始化為0。
            2.在程式執行之前建立。
            3.在編譯過程中值已經和對應變數名建立關係,儲存在data區(全域性
                變數中已初始化的資料)。
        自動變數:沒有省缺的初始值。
            提供一條隱式的賦值語句使與變數名建立關係。
    
第八節 static關鍵字
當用於不同的上下文環境時,static關鍵字具有不同的意思。
    一.用於程式碼塊之外的變數宣告或定義函式時:
        1.static關鍵字用於修改識別符號的連線屬性,從external改為internal。
        2.但識別符號的作用域和儲存型別(函式的儲存型別本身就是靜態的)不受影響。
    二.用於程式碼塊內部的變數宣告時:
        1.static關鍵字用於修改變數的儲存型別。
        2.變數的連線屬性和作用域不受影響。在程式執行之前建立???