C語言中const定義常量和巨集常量的區別

2021-10-07 18:39:55 字數 1347 閱讀 2704

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定義,大部分編譯器將在編譯的...