變量地址在 C 語言中本質上是指針值,應使用對應的指針類型存儲:
| 變量類型 | 地址類型 | 聲明示例 |
|---|---|---|
char | char * | char *p = &c; |
int | int * | int *p = &i; |
double | double * | double *p = &d; |
struct S | struct S * | struct S *p = &s; |
void (通用) | void * | void *p = &x; |
極少數情況 (與硬件交互、序列化、調試打印) 需用整數存地址,必須選用足夠寬度的無符號整數:
| 平台位寬 | 地址寬度 | 推薦類型 (<stdint.h>) | 備選 |
|---|---|---|---|
| 16 位 | 16 bit (2 byte) | uint16_t / uintptr_t | unsigned int |
| 32 位 | 32 bit (4 byte) | uint32_t / uintptr_t | unsigned long |
| 64 位 | 64 bit (8 byte) | uint64_t / uintptr_t | unsigned long long |
uintptr_t
#include
#include // PRIuPTR
uintptr_t addr = (uintptr_t)&var;
printf("Address: 0x%" PRIxPTR "\n", addr); // 可移植打印
uintptr_t 由 C99 標準保證能容納任意對象指針轉換的整數值。intptr_t 為有符號對應類型。int/long — 在 64 位 Linux/Windows (LP64/LLP64) 上 long 可能 4/8 字節不一致,極易移植出錯。
printf("%p\n", (void*)&var); // %p 期望 void*,輸出實現定義格式 (通常 0x...)