在C語言中,int()[5]和int是兩種完全不同的指針類型,理解它們的區別對于正確處理數組和多維數組至關重要。下面詳細解釋:
1:int*(指向整型的指針)
- 含義:指向單個int類型數據的指針
- 典型用法:
int a = 10;
int* p = &a; // p指向一個int變量
- 與一維數組的關系:
int arr[5] = {1, 2, 3, 4, 5};
int* p = arr; // arr自動轉換為&arr[0],類型是int*
2:int(*)[5](指向數組的指針)
- 含義:指向一個“包含5個int元素的數組”的指針,而非指向單個int
- 典型用法:
int arr[5] = {1, 2, 3, 4, 5};
int (*p_to_array)[5] = &arr; // p_to_array指向整個數組
- 關鍵區別:
1:p_to_array的類型是int()[5],表示“指向一個長度為5的int數組的指針”
2:對p_to_array解引用(p_to_array)會得到整個數組(類型是int[5]),而p_to_array又會自動退化為int(指向數組首元素)
3: 為什么&arr的類型是int(*)[5]?
-
arr是一個長度為5的int數組,&arr表示“取整個數組的地址”,因此類型是指向數組的指針(int(*)[5])
-
這與&arr[0](類型是int*)不同:
printf("%p\n", &arr); // 類型:int(*)[5],指向整個數組
printf("%p\n", &arr[0]); // 類型:int*,指向首元素
- 雖然兩者的內存地址值相同,但指針類型不同,導致指針運算的行為不同(見下文)。
4: 類型差異導致的指針運算區別
- int*的算術以int為單位:
int* p = arr;
p++; // 移動sizeof(int)字節(如4字節),指向arr[1]
- int(*)[5]的算術以“整個數組”為單位:
int (*p_to_array)[5] = &arr;
p_to_array++; // 移動sizeof(int[5])字節(如20字節),指向“下一個長度為5的數組”
- 如果arr是單獨定義的數組,p_to_array++會越界(因為不存在下一個數組)
5:例子1
6:例子2,輸出結果是相同的
int arr[5] = {1, 2, 3, 4, 5};int (*p_to_array)[5] = &arr; // p_to_array指向整個數組printf("%d\n", (*p_to_array)[2]);int arr2[5] = {1, 2, 3, 4, 5};int *p_to_array2 = &arr2; // p_to_array2指向整個數組printf("%d\n", *(p_to_array2+2));