&arr[0])。sizeof(arr)、&arr、字符串字面量初始化時,數組名代表整個數組對象。char cs[] = "ABC";
printf("%p %p %p\n", cs, &cs[0], &cs); // 三者數值相同,類型不同
// cs: char* &cs[0]: char* &cs: char(*)[4]
char cs[] = "ABC";
printf("%p\n%p\n%p\n%p\n", cs, &cs[0], &cs[1], &cs[2]);
// 輸出地址依次遞增 1 byte
char *p = str;
for (int i = 0; i < len; i++) {
printf("%c\n", *p);
p++; // 移動到下一元素
}
char *p = str;
for (int i = 0; i < len; i++)
printf("%c\n", *(p + i)); // p 不變
char *p = str;
while (*p != '\0') {
printf("%c\n", *p++);
}
int nums[] = {111,222,333,444};
int *p = nums;
for (int i = 0; i < 4; i++)
printf("%d\n", *p++); // 每次遞增 sizeof(int) 位元組
int nums[] = {111,222,333,444};
int *p = nums;
printf("%d\n", *p); // 111
printf("%d\n", *(p+1)); // 222 (地址 + sizeof(int))
printf("%d\n", *p+1); // 112 (取值後 +1,非指標運算!)
p+1 ≠ 地址+1,而是 地址 + sizeof(*p)。這是指標運算的核心規則。
int *p = nums; // 指向 int
int nums[4] = {111,222,333,444};
int (*p)[4] = &nums; // 注意括號優先級:指向含4個int數組的指標
printf("%d\n", (*p)[1]); // 222,用法繁瑣
數組指標保留數組長度信息,sizeof(*p) 返回數組總大小,但使用麻煩,極少直接使用,多用於函數參數傳遞多維數組。
int arr[3][4];
int (*p)[4] = arr; // arr 退化為指向首行的指標
int *p2 = &arr[0][0]; // 指向首個元素
// p+1 跳過一行 (4*sizeof(int)),p2+1 跳過一個元素
| 概念 | 聲明 | 指向 | 算術步長 | 典型用途 |
|---|---|---|---|---|
| 元素指標 | int *p | 單個元素 | sizeof(int) | 遍歷、函數參數 |
| 數組指標 | int (*p)[N] | 整個數組 | sizeof(int[N]) | 多維數組參數 |
| 數組名 | int arr[N] | 首元素(多數情況) | 不可修改 | 定義、sizeof、&arr |
arr = p; 錯誤,數組名非常量指標。int arr[] 實為 int *arr,sizeof(arr) 返回指標大小。ptrdiff_t),非位元組差。"abc" 類型為 const char[4],賦值給 char* 違反 const(C++ 錯誤,C 警告)。