2.巨集常量
3.兩者區別
關鍵字const 定義的是變數不是常量, 而是去改變乙個變數的儲存類,把該變數所佔的記憶體變為唯讀。這就是變數的值不允許改變的常變數。該常量帶有資料型別。編譯執行的時候起作用存在型別檢查。
#include
const
int a =1;
const
static
int b;
void
foo(
int*p,
int val)
intmain()
執行結果:
a = 1
segmentation fault (core dumped)
其中a是全域性變數,b是靜態全域性變數,c是區域性變數,d是靜態區域性變數。
【特別地】
靜態儲存區分為data段和bss段。
bss段存放的是未初始化的普通全域性變數、靜態區域性變數、靜態全域性變數,
data段存放的是已初始化的普通全域性變數、靜態區域性變數、靜態全域性變數,其中data段又分為唯讀段和可讀可寫段。
現代編譯器中關鍵字const修飾的全域性變數、靜態區域性變數變數和靜態全域性變數就是存放在data段中的唯讀段,所以這些變數為唯讀屬性,其值通過指標也不可改變。而const修飾的區域性變數存放在棧中,可以通過指標改變其值。
【注意】:字串常量就是儲存在data段的唯讀段,不能通過指標改變其值。
const int p; //p可變,p指向的內容不可變
int const p; //p可變,p指向的內容不可變
int * const p; //p不可變,p指向的內容可變
cons int* cons p;//p不可變,p指向的內容不可變
注:
當const出現在 *號左邊的時候,指標指向的資料不可改變,但是指標本身的值可以改變;
當const出現在 *號右邊的時候,指標本身不能改變但是它指向的資料可以改變
預處理器#define 定義的是不帶資料型別的常數,只進行簡單的字元替換。 在預編譯的時候起作用,不存在型別檢查。
#define 是巨集定義,它不能定義常量,但巨集定義可以實現在字面意義上和其它定義常量相同的功能。
#define 巨集是在預處理階段展開。
const 常量是編譯執行階段使用。
#define 巨集沒有型別,不做任何型別檢查,僅僅是展開。
const 常量有具體的型別,在編譯階段會執行型別檢查。
#define 巨集僅僅是展開,有多少地方使用,就展開多少次,不會分配記憶體。(巨集定義不分配記憶體,變數定義分配記憶體。)
const定義常量會分配記憶體。
define巨集定義和const常量定義之間的區別
define部分 巨集不僅可以用來代替常數值,還可以用來代替表示式,甚至是 段。巨集的功能很強大,但也容易出錯,所以其利弊大小頗有爭議。巨集的語法為 define 巨集名稱 巨集值 注意,巨集定義不是c或c 嚴格意義上的語句,所以其行末不用加分號結束。作為一種建議和一種廣大程式設計師共同的習慣,巨集...
define巨集定義和const常量定義之間的區別
用巨集表示常數 假如我們要寫乙個有關圓的種種計算的程式,那麼 3.14159 值會被瀕繁用到。我們顯然沒有理由去改 的值,所以應該將它當成乙個常量對待,那麼,我們是否就不得不一遍一遍地寫3.14159這一長串的數呢?必須有個偷懶的方法,並且要提倡這個偷懶,因為多次寫3.14159,難免哪次就寫錯了。...
define巨集定義和const常量定義之間的區別
define 定義預編譯時處理的巨集 只進行簡單的字元替換,無型別檢測 const 定義程式中的常量,編譯時處理 常量修飾符,把變數定義為常量 typedef 定義型別別名 例 typedef int a 則 a a 定義a為int inline 定義內聯函式。const定義,大部分編譯器將在編譯的...