int array[10] = {1023,2,3,4,5,6};
int *p = &array[0];
int *p1 = array; // array 退化為首元素地址
printf("%p, %p\n", array, &array[0]); // 相同地址
printf("sizeof(array)=%zu, sizeof(p1)=%zu\n", sizeof(array), sizeof(p1)); // 40 vs 8
sizeof(array) 是整個數組大小;sizeof(p1) 是指針大小。array 不可修改(非常量指針),p1 可修改。
printf("%d\n", *((char*)p1 + 1)); // 輸出 1023 的第二個字節(小端模式下為 3)
將 int* 強轉為 char* 後 +1 僅移動 1 字節,可逐字節檢查整數在內存中的字節序。
int i = 0x12345678;
char *cpi = (char*)&i;
printf("%x %x %x %x\n", cpi[0], cpi[1], cpi[2], cpi[3]);
// 小端輸出: 78 56 34 12
// 大端輸出: 12 34 56 78
x86/ARM 通常為小端;網絡字節序為大端。htonl/ntohl 用於轉換。
int array[10] = {0};
int *p = array;
for (int i=0; i<10; i++) scanf("%d", p++); // 依次寫入
for (int i=0; i<10; i++) printf("%d\n", array[i]);
char *s[10]; // 指針數組:10 個 char*
char (*s1)[10]; // 數組指針:指向 10 元素 char 數組的指針
char c1[2], c2[3], c3[4];
s[0] = c1; s[1] = c2; s[2] = c3; // OK
char cc[2][10];
s1 = cc; // OK: cc 退化為指向 [10]char 的指針
s1 = &cc[1]; // OK
記憶口訣:*s[10] 先結合 [10] → 數組;(*s1)[10] 先結合 * → 指針。
sizeof、& 時保持數組類型。