左值:賦值號左側,代表**內存地址**(編譯期確定)。
右值**:賦值號右側,代表**地址中存儲的數據**(運行期讀取)。
| 符號 | 左值語境 | 右值語境 |
|---|---|---|
int a | 地址 &a | 數值 |
int *p | 指針變量地址 &p | 指向的地址 p |
*p | 目標地址 p | 目標數值 |
int arr[10] | **非法**(常量地址) | 首元素地址 &arr[0] |
"hello" | 非法 | 首字符地址 |
arr[i] 直接計算 base + i*sizeof,**無運行期指針讀取**。char ga[] = "abcdefghijklmn";
char *gp = "abcdefghijklmn";
printf("ga = %#x\n", ga); // 數組名右值 → 首地址
printf("&ga = %#x\n", &ga); // 數組地址 → 同值,類型不同
printf("gp = %#x\n", gp); // 指針右值 → 字面量地址
printf("&gp = %#x\n", &gp); // 指針變量自身地址
void fa(char ca[10]) { // 退化為 char *ca
printf("&ca = %#x\n", &ca); // 形參指針變量地址(棧上)
printf("ca = %#x\n", ca); // 同實參首地址
++ca; // 合法:修改局部副本
}
void fp(char *pa) {
printf("&pa = %#x\n", &pa);
printf("pa = %#x\n", pa);
++pa;
}
// file1.c int a[10]; // file2.c extern int *a; // 錯誤!以指針方式訪問 → 先讀地址再解引用 → 崩潰 // 正確:extern int a[]; 或 extern int a[10];
char a[] 實為 char *a,調用時傳數組名仍按地址傳遞。