代碼對比
int array[5] = {10,20,30,40,50};
printf("%d\n", &array[i]); // 錯誤:%d 期望 int,實傳 int* → 未定義行為
printf("%p\n", array[i]); // 錯誤:%p 期望 void*,實傳 int → 未定義行為
printf("%p\n", &array[i]); // 正確:打印第 i 元素地址
格式化字符串與參數類型對照表
| 格式符 | 期望類型 | 典型用法 |
%d | int | 打印整數值 |
%p | void* | 打印地址,**必須強轉** (void*)&array[i] |
%x/%lx | unsigned int/long | 打印十六進制地址(非標準但常用) |
正確打印地址的標準寫法
printf("array[%d] address = %p\n", i, (void*)&array[i]);
%p 要求 void*,嚴格遵循 C 標準請強轉。
- 若編譯器警告
format '%p' expects argument of type 'void*',即為類型不匹配。
進階:數組名與指針的區別
int a[5];
printf("%p\n", (void*)a); // 首元素地址
printf("%p\n", (void*)&a); // 整個數組地址(值相同,類型不同:int(*)[5])
printf("%p\n", (void*)&a[0]); // 同 a
// sizeof(a) = 20 (整個數組大小)
// sizeof(&a) = 8/4 (指針大小)
避坑口訣
- 打印地址 →
%p + (void*)。
- 打印整數 →
%d / %ld。
- 格式符與實參**逐個對應**檢查,開啟
-Wall -Wextra -Wformat=2 讓編譯器幫你查。