25 給定下列 C 語言程式的變數宣告指令:

則下列何者可以正確執行?
(A)*p2+=3;
(B) p3=&j;
(C) p4=&j;
(D) p2=p1;
統計: A(76), B(97), C(82), D(126), E(0) #3275176
詳解 (共 3 筆)
核心定義
在 C 語言中,const 關鍵字用於指標宣告時,其位置決定了是「指標指向的內容」為常數,還是「指標本身」為常數。
? 重點整理
| 指標宣告 | 讀法解析 | 記憶體權限 |
| int *p1; | 一般指標 | 內容 $(*p1)$ 可修改;指標本身 $(p1)$ 可修改。 |
| const int *p2; | 指向常數的指標 (Pointer to const) | 內容 $(*p2)$ 不可修改;指標本身 $(p2)$ 可修改 (可指向其他變數)。 |
| int * const p3; | 常數指標 (Const pointer) | 內容 $(*p3)$ 可修改;指標本身 $(p3)$ 不可修改 (一旦初始化,永遠指向相同變數)。 |
| const int * const p4; | 指向常數的常數指標 | 內容 $(*p4)$ 不可修改;指標本身 $(p4)$ 不可修改。 |
初始變數狀態
| 變數 | 初始值 | 類型 | 可修改項目 |
| i | $1$ | int | |
| j | $2$ | int | |
| p1 | $\&j$ | int* | 內容 $(*p1)$ 與指標 $(p1)$ 皆可修改 |
| p2 | $\&i$ | const int* | 內容 $(*p2)$ 不可修改;指標 $(p2)$ 可修改 |
| p3 | $\&i$ | int* const | 內容 $(*p3)$ 可修改;指標 $(p3)$ 不可修改 |
| p4 | $\&i$ | const int* const | 內容 $(*p4)$ 與指標 $(p4)$ 皆不可修改 |
? 記憶技巧
口訣:「星號左側是內容,星號右側是指標」
-
const int *p2 $\to$ const 在 * 左側,表示內容為常數 $(*p2$ 不可改)。
-
int * const p3 $\to$ const 在 * 右側,表示指標為常數 $(p3$ 不可改)。
? 考試重點 (選項分析)
(A) *p2 += 3;
-
動作:試圖修改 p2 所指向的內容 ($*p2$),即將 i 的值改為 $i+3$。
-
判斷:p2 是 const int * (指向常數的指標),其內容 $(*p2)$ 不可修改。
-
結果:錯誤 (編譯器會報錯)。
(B) p3 = &j;
-
動作:試圖修改 p3 本身的值,使其指向變數 j 的位址。
-
判斷:p3 是 int * const (常數指標),其指標本身 $(p3)$ 不可修改。
-
結果:錯誤 (編譯器會報錯)。
(C) p4 = &j;
-
動作:試圖修改 p4 本身的值,使其指向變數 j 的位址。
-
判斷:p4 是 const int * const,其指標本身 $(p4)$ 不可修改。
-
結果:錯誤 (編譯器會報錯)。
(D) p2 = p1;
-
動作:試圖修改 p2 本身的值,使其指向 p1 當前指向的位址 (即 j 的位址 $\&j$)。
-
判斷:p2 是 const int * (指向常數的指標),其指標本身 $(p2)$ 是可修改的。
-
賦值後,p2 變成指向 j 的位址。
-
-
結果:正確。
正確答案為 (D)