const 用於限定變數值不可修改,建立常量。常量必須在定義時初始化,之後任何賦值行為皆導致編譯錯誤。
const int MaxNum = 100; // 推薦寫法 int const MaxNum = 100; // 等效但不推薦 // MaxNum = 90; // 錯誤:嘗試修改 const 變數
慣例將常量名首字母大寫以示區別。初始化可使用任意表達式(含函式呼叫、變數),支援執行期初始化。
const int *p1; // 指向常量整數的指標(資料唯讀) int const *p2; // 同上 int *const p3; // 常量指標(指標本身唯讀) const int *const p4; // 指標與資料皆唯讀 int const *const p5; // 同上
記憶口訣: const 靠近變數名修飾指標本身,靠近類型修飾指向資料;兩側皆有則雙重保護。
單獨定義 const 變數可用 #define 替代,真正價值在於函數參數保護。防止函數內部誤修改指標指向的資料,同時向呼叫者承諾「不會修改你的資料」。
// 標準庫函數原型示例 size_t strlen(const char *str); int strcmp(const char *str1, const char *str2); char *strcpy(char *dest, const char *src); int printf(const char *format, ...);
#include <stdio.h>
#include <string.h>
size_t strnchr(const char *str, char ch) {
int i, n = 0, len = strlen(str);
for (i = 0; i < len; i++)
if (str[i] == ch) n++;
return n;
}
int main() {
char *str = "https://c.biancheng.net";
char ch = 't';
printf("%d\n", strnchr(str, ch)); // 輸出 3
return 0;
}
const char * → char *:禁止(降低權限 → 提升權限,危險)。char * → const char *:允許(提升權限 → 降低權限,安全)。const char *str1 = "c.biancheng.net";
char *str2 = str1; // 警告/錯誤
func(str1); // 傳參本質是賦值,同樣報錯
void func(char *str) { }
標準庫函數參數多為 const,但傳入非 const 引數完全合法且安全。