[英]How do pointers to arrays of integers work in C?
看一下這個例子:
#include <stdio.h>
#include <stdlib.h>
int main() {
int a[5] = {1,2,3,4,5}; // LINE A
int (*b)[5] = &a; // LINE B
printf("%d\n", (*b)[0]); // LINE C
}
我嘗試在LINE B
上寫int (*b)[5] = a
,但是沒有用。 誰能解釋為什么這行不通? 我雖然陣列為什么我需要明確采取的地址衰變成指針,所以我不是很了解a
通過&a
。 這就像a
已經是一個指針,因為它腐爛,但現在我需要一個指針的地址? 雙指針? ??
誰能解釋(*b)[0]
工作原理? 就像我取消引用b
,它本身是一個指向5個int數組的指針,但是我不知何故采用了它的[0]個元素? 在這種情況下,第[0]個元素不是5個整數嗎? 我以某種方式最終得到一個整數,並且輸出1
。
我真的很困惑 謝謝。
int a[5]={1,2,3,4,5};
-------In Memory----------
| 1 || 2 || 3 || 4 || 5 |
---------------------------
101 105 109 113 117 //Assume these are addresses
默認情況下,數組名稱的作用類似於指向第一個元素的指針。 因此a
行為類似於指向第一個元素的指針(此處元素為整數)
所以a
被分解為int *a
; 這就是為什么如果您增加一,那么它將跳到該元素的下一個地址,如下所示。它將像這樣計算: 第一個元素的地址+(n * sizeof(int))
(a+0)--->101 // 101 + 0*sizeof(int)
(a+1)--->105 // 101 + 1*sizeof(int)
(a+2)--->109 // 101 + 2*sizeof(int)
(a+3)--->113 // 101 + 3*sizeof(int)
(a+4)--->117 // 101 + 4*sizeof(int)
但是&a
就像一個指向完整數組的指針(在本例中為5個整數),這意味着當您向其添加一個整數時,它將嘗試指向接下來的5個整數。如下所示
(&a+1)----->121 //101 + 1*sizeof(a)
這就是為什么在這一行中int (*b)[5] = &a;
沒問題,但是當您嘗試int(*b)[5]=a;
它給出錯誤,因為a
是指向單個整數的指針,而as(* b)[5]是指向5個整數的指針。您不能分配不兼容的指針類型。
b
是指向數組a
的指針。 取消引用b
將給整個數組a
。 因此,當您在表達式中使用*b
時,它表示該被取消引用的數組的名稱。 由於數組名稱被轉換為指向數組第一個元素的指針,因此*b
衰減為指向a
(或*b
)的第一個元素的指針。 *b
衰減后的類型為int *
。 因此, (*b)[i]
將給出b
指向的數組的第 i 個元素。
當您聲明-int a [5]-編譯器使用'a'作為對內部存儲器的引用。 “ a”本身不是變量。 因此,&a不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.