代碼:
int n = 2, *p = &n, *q = p;
// 哪個賦值非法? A p=q B *p=*q C n=*q D p=n
| 選項 | 左值類型 | 右值類型 | 合法性 | 說明 |
|---|---|---|---|---|
| A p=q | int* | int* | ✅ 合法 | 指針賦值指針,地址傳遞 |
| B *p=*q | int | int | ✅ 合法 | 解引用後賦值整數,值傳遞 |
| C n=*q | int | int | ✅ 合法 | 整數變量賦值整數 |
| D p=n | int* | int | ❌ 非法 | 指針需地址,n 是整數值 |
&變量、malloc返回值、其他指針、NULL/0*p) 相當於所指變量,可參與數值運算與賦值p = (int*)n 但極度危險)
// GCC 編譯選項 -Wall -Wextra -pedantic
warning: assignment to 'int *' from 'int' makes pointer from integer without a cast
// 嚴格模式視為錯誤
int n = 2;
int *p = &n; // 取地址
int *q = p; // 指針複製
*p = 10; // 修改 n 為 10
n = *q; // n 賦值為 10 (同樣)
int *r = malloc(sizeof(int)); // 動態分配地址
free(r);