C和指針_第3章_數(shù)據(jù)_學(xué)習(xí)筆記
1.typedef
typeof?char?*ptr_to_char; ptr_to_char?a,?b; //等價于 char?*a?,?*b; //若如下則不然 #define?d_ptr_to_char?char* d_ptr_to_char?a?,b; //等價于 char?*a; char?b;
2.常量
//關(guān)于指針和常量 int?const?*ptr;
這是一個指向整型常量的指針??梢孕薷闹羔樀闹?,但不能修改指針?biāo)赶虻闹怠?/p>
int?*?const?ptr;
申明ptr是一個指向整型的常量指針。指針的值為常量,無法修改。但其指向的整型值可修改。
int?const?*?const?ptr;
無論是指針還是指針指向的值均為常量,不能修改。
3.作用域
文件作用域、函數(shù)作用域、代碼塊作用域和原型作用域。其中一對花括號之間的所有語句成為一個代碼塊。
4.鏈接屬性
external、internal和none
typedef?char?*a; int?b; int?c(int?d) { ????int?e; ????int?f(int?g?); }
默認(rèn)狀態(tài)下,標(biāo)識符b,c,f的鏈接屬性為external。
代碼塊外變量默認(rèn)為external,函數(shù)聲名默認(rèn)具有external屬性。
關(guān)鍵字exter和static可以在聲明中修改標(biāo)識符的鏈接屬性。static只對默認(rèn)鏈接屬性為exter的聲明才具有改變鏈接屬性的效果。
5.存儲類型
普通內(nèi)存、運(yùn)行時棧、硬件寄存器。
凡在任何代碼塊之外聲明的變量總存儲于靜態(tài)內(nèi)存中,也就是不屬于堆棧的內(nèi)存,靜態(tài)變量(static)。若不設(shè)置初始值,默認(rèn)0.
在代碼塊內(nèi)部聲明的變量的默認(rèn)存儲類型為automatic,若不設(shè)置初始值,值未知。
注意:
? ? static:
????????當(dāng)其用于函數(shù)定義或者用于代碼塊之外的變量聲明時,值用于改變標(biāo)識符的鏈接屬性,不改變其存儲類型和作用域。
????? ? 當(dāng)其用于代碼塊內(nèi)部的變量聲明時,用于修改變量的存儲類型。
全局所有代碼塊之外否從聲明處至文件尾不允許從其他源文件訪問局部代碼塊起始處是整個代碼塊
變量不存儲于堆棧中,它的值在程序整
個執(zhí)行期一直保持
形式參數(shù)函數(shù)頭部是整個函數(shù)不允許
6.編程提示
? ? 6.1 為了保持最佳的可移植性,把字符的值限制在有符號和無符號字符范圍的交集之內(nèi),或者不要在字符上執(zhí)行算數(shù)運(yùn)算。
? ? 6.2 用它們在使用時最自然的形式來表示整型常量。
? ? 6.3? 不要把整型值和枚舉值混用。
? ? 6.4 不要依賴隱式聲明。
? ? 6.5 在定義類型的新名字時,采用typedef而不是#define
? ? 6.6 用const聲明其值不會修改的變量。
? ? 6.7 使用名字常量而不是整型常量。
? ? 6.8 不要在嵌套的代碼塊使用相同的變量名。
? ? 6.9 除了實體的具體定義位置之外,在它的其他聲明位置都使用extern關(guān)鍵字。
變量類型? | 聲明位置 | 是否存在于堆棧 | 作用域 | 如果申明為static |
---|