const修飾的資料型別是指常型別,常型別的變數或物件的值是不能被更新的。
最初的目的是為了取代預編譯指令define,繼承define的優點並且擯棄它的缺點。
舉兩個例子:
1.從記憶體角度
#define max_d 10
const int max_c = 10; //此時儲存在符號表,未分配記憶體
int main(void)
2.從語句使用:(const能避免一些巨集define因為沒有括號引起的錯誤)
#define max_d 10 + 20
const int max_c = 10 + 20;
.....
int num_d = max_d / 2; //因為巨集的特性預編譯後num_d = 10 + 20 / 2
int num_c = max_c / 2; //執行後num_c = 30 / 2;
3.小結
資料型別:cosnt修飾的變數有明確的型別,而巨集沒有明確的資料型別(不安全,但很靈活->很強大)
安全方面:const修飾的變數會被編譯器檢查,而巨集沒有安全檢查,可能會發生意外的錯誤(邊界效應)
記憶體分配:cosnt修飾的變數只會在第一次賦值時分配記憶體,節省空間,避免不必要的記憶體分配,同時提高效率,而巨集是直接替換,每次替換後的變數都會分配記憶體
作用場所:const修飾的變數作用是在編譯、執行過程中,而巨集作用在預編譯 **除錯:cosnt方便除錯,巨集在預編譯進行所以沒法除錯。
1.修飾唯讀常量,不能被改變。改變報錯。
2.修飾一般變數(const的位置可以在型別說明符前或後)
int const num=2;
const int num=2;
3.修飾唯讀陣列(const的位置可以在型別說明符前或後)
int const num[2]=;
const int num[2]=;
4.修飾指標(四種形式)
const int *ptr; //ptr可變,指向物件不能變
int const *ptr; //ptr可變,指向物件不能變
int * const ptr; //ptr不可變,指向物件可變
const int * const ptr; //ptr都不可變
我也搞混淆了很多次,不過總結了一下,在分析就完全ok了。
①首先我們得知道const一次只能修飾乙個變數
②然後我們得根據就近原則,所謂「近水樓台先得月」來判斷哪個變數跟cosnt最近,是(*ptr)還是ptr。
③之前也有提到const的位置可以在型別說明符前或後。
const int *ptr; //const與*ptr近,與ptr遠
int const *ptr; //const與*ptr近,與ptr遠
int * const ptr; //const與ptr近,已經拆分了*ptr
const int * const ptr; //第二個const與ptr近,第乙個const顯然與(* const ptr)近
5.修飾函式引數
void fun(const int *p); //意義指標變數本身可變,p所指向的變數不可變
①告訴編譯器傳入引數不能改變,防止使用者的無意或錯誤的修改
②修飾指標傳參,就是在宣告函式內部不會改變這個指標所指向的內容。(一般是做函式輸入引數)
③補充:這也可以只知道函式原型時可以大概去判斷函式列表裡的輸入引數與輸出引數
6.修飾返回值
const int fun (void); //返回值不可被改變。
1.const常量可以被改變(gcc環境下)
const int num = 5;
int *p = (int *)# //強制型別轉換來消除警告;
*p = 10;
printf("num = %d.\n", num); //num = 10,const型別的變數被修改
原因:
①const在c的規定中並未有明確規定,const修飾的變數存放在**
②在gcc環境下,const是通過編譯器在編譯的時候執行安全檢查,在程式執行過程中並不會報錯。
③記憶體的儲存上,gcc把const型別的常量也放在了data段
④所以根據這些特性,通過強大的指標騙過編譯器就可以改變了
1.const的合理使用能告訴編譯器哪些變數不希望改變,防止無意的被修改,減少bug,也使**更嚴謹。
2.const的使用也是為讀**的人傳遞很有用的資訊,間接或直接告訴使用者這個變數不應該被修改。
對Flex布局的總結與思考
閱讀本文之前最好對flex布局有基本了解,可以通過 參考資料 中列舉的資源來學習。一維布局模型 one dimensional layout model 元素項沿著水平或垂直方向來排列,就像一條沿著乙個方向的 流 與之對應的,css grid layout是乙個二維布局模型。兩者互為補充。空間分配 ...
c 中對const的總結
c 中const總結 對於基本宣告 1.const int r 100 標準const變數宣告加初始化,因為預設內部連線所以必須被初始化,其作用域為此檔案,編譯器經過型別檢查後直接用100在編譯時替換 2.extend const int r 100 將const改為外部連線,作用於擴大至全域性,編...
c 中對const的總結
c 中const總結 對於基本宣告 1.const int r 100 標準const變數宣告加初始化,因為預設內部連線所以必須被初始化,其作用域為此檔案,編譯器經過型別檢查後直接用100在編譯時替換 2.extend const int r 100 將const改為外部連線,作用於擴大至全域性,編...