賦值運算子 = 右結合,運算式值為左運算元賦值後的值。支援鏈式賦值 a = b = c = 0;。
int a, m;
float n;
a = 100; m = 20;
n = a * m * 0.1f; /* 隱性轉型:int→float */
char c0, c1, c2;
c0 = 'b'; /* 字元常數 */
c1 = 50; /* ASCII 碼值 (十進位) */
c2 = '\x0D'; /* 十六進位逸出序列 (CR) */
int *pi;
char *ps;
pi = (int *)malloc(sizeof(int)); /* 配置空間,取得位址 */
*pi = 100; /* 透過指標寫入物件 */
ps = "Good"; /* 指標指向字串常值 */
/* *ps = 'B'; 錯誤:字串常值不可修改 */
int m[2][2];
float f[3];
m[0][0] = 0; m[0][1] = 17; m[1][0] = 21;
f[0] = 109.5f; f[1] = -8.29f; f[2] = 0.7f;
char s[30];
strcpy(s, "Good News!"); /* 正確:逐字元複製含 \0 */
/* 錯誤寫法 */
char s2[30];
s2 = "Bad"; /* 編譯錯誤:陣列名非左值,不可整體賦值 */
長字串分行:相鄰字串常值自動串接
strcpy(s, "The writer would like to thank you for"
"your interest in his book. He hopes you"
"can get some helps from the book.");
char *f[2];
int *a[2];
f[0] = "thank you";
f[1] = "Good Morning";
*a[0] = 1; /* a[0] 必須先指向有效 int */
*a[1] = -11;
未初始化指標 = 隨機位址,解參考 = UB (可能破壞系統)。
#include
int *pi = malloc(sizeof(int));
*pi = 420;
char *ps = malloc(20);
strcpy(ps, "Good, Answer!");
#include /* Turbo C 舊式標頭,現代用 */
int *pa = malloc(3 * sizeof(int));
*pa = 1234;
*(pa + 1) = 4567; /* 等價 pa[1] */
*(pa + 2) = 234; /* 等價 pa[2] */
pa + i 位址遞增 i * sizeof(*pa) 位元組,非單純位元組位移。
上例 sizeof(int)=2 (16-bit 環境) → pa+1 相隔 2 bytes。
| 錯誤代碼 | 問題 | 修正 |
|---|---|---|
char *p; *p = 'A'; | 野指標 | char *p = malloc(N); 或 char buf[N]; p = buf; |
char s[10]; s = "Hi"; | 陣列名非左值 | strcpy(s, "Hi"); 或 snprintf(s, sizeof s, "Hi"); |
char *p = "Hi"; p[0] = 'B'; | 修改字串常值 (UB) | char p[] = "Hi"; p[0] = 'B'; 或 strcpy(buf, "Hi"); |
free(p); *p = 0; | 使用已釋放記憶體 | free(p); p = NULL; |
std::vector/string;C 專案可封裝簡易動態陣列結構體。malloc 對應一個 free,釋放後指標置 NULL。snprintf/strncpy_s:避免緩衝區溢位。const 表達意圖:const char *p (指向常值)、char *const p (常值指標)、const char *const p (雙重常值)。