[英]How come the first element of an array is equal to the array ?C
例如,假設您有一個數組a和一個指針p。
void main() {
int a[10];
int *p;
for(i = 0;i <=10;i++)
a[i] = (i + 1) * 2;
p = &a[0];
printf("%d",a[4]);
printf("%d",p[4]);
}
它們如何相等?
數組的第一個元素怎么等於數組? 。 假設您有一個整數數組,例如int arr[5];
然后根據您的問題標題
arr[0]
,它是arr[0]
值,並且 arr
和arr
名稱代表數組的基地址。 因此arr
和arr[0]
不相同。 arr
是基地址,而arr[0]
是值。 對於您的特殊情況,整數數組a
如下所示,並且數組的所有元素都存儲在連續的內存位置中。 假定數組的基地址為0x100
(某些內存位置)
a[0] a[1] a[2] a[3] ........................................ a[9]
------------------------------------------------------------------------
| 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 |
------------------------------------------------------------------------
0x100 0x104 0x108 .. ..
a
LSB MSB
所以這里a
手段0x100
,假定的基地址a
是0x100
。 現在當你做
p = &a[0]; /* here you are setting p to point to one of the places in the array a and that is a[0] */
這里p
指向如下a
ie 0x100
first
元素
a[0] a[1] a[2] a[3] ........................................ a[9]
------------------------------------------------------------------------
| 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 |
------------------------------------------------------------------------
0x100 0x104 0x108 0x112 0x116.. ..
a
|
p
現在,當您打印a[4]
它會打印出10
,這非常簡單,並且展開如下
a[4] = *(a + 4) /* here you can say that array name a is converted to a pointer to its first element */
= *(0x100 + 4*4 ) /* multiplied by 4 ? bcz a is int array & each element size is 4 byte */
= *(0x116) /* value at 0x116 memory location */
= 10
當您打印p[4]
它會如下擴展
p[4] = *(p + 4)
= *(0x100 + 4*4) /*multiplied by 4 because int pointer increments by 4 bytes*/
= *(0x116) ? /* it prints value at 0x116 location which 10 */
= 10
同樣,在為for loop
中的數組元素分配值時,您嘗試訪問a[10]
,它超出邊界並導致未定義的行為 。 在下面的代碼塊條件中,部分應該為i<10
而不是i<=10
因為您聲明a[10]
且數組索引zero
。
for(i = 0;i <=10;i++) { /* make it i<10 */
a[i] = (i + 1) * 2;
}
最后, void main() { /* code */ }
是一種不好的做法,並且不符合C標准規范。 使用int main(void) { }
代替C標准n1256
草案中指定的n1256
。
5.1.2.2.1程序啟動
1在程序啟動時調用的函數稱為main。 該實現沒有為此函數聲明任何原型。 它應使用返回類型int且不帶參數來定義:
int main(void) { /* ... */ }
或帶有兩個參數(盡管可以使用任何名稱,但在此處稱為argc和argv,因為它們是聲明它們的函數的局部名稱):
int main(int argc, char *argv[]) { /* ... */ }
或等效; 9)或以其他一些實現定義的方式。
數組定義 :數組是放置在連續內存位置中的一系列相同類型的元素,可以通過向唯一標識符添加索引來單獨引用。
當你把所述陣列的所述第一元素的地址( &a[0]
將得到的值完全相同作為a
。 (但是,您將丟失大小信息,因為&a[0]
是指向內存的指針,其中a
實際上是數組)
這是因為a[0]
實際上轉換為*(a + 0)
,其中a
是指向數組所駐留的內存地址的指針。 因此&a[0]
變為&(*(a + 0))
或“地址a + 0
的內容的地址”,與“地址a
”相同
類似地, a[4]
轉換為*(a + 4)
。
我希望這可以使事情變得清晰:)
編輯:
我剛剛找到此頁面,您可以在這里找到更多信息: https : //www.le.ac.uk/users/rjm1/cotter/page_59.htm
編輯2:闡明&a[0]
和a
之間的區別
數組存儲在傳染性內存中,&a [0]是對第一個元素的指針引用。 現在,如果要獲取指向第二個的指針引用,則為(第一個元素的地址+ sizeof(int))。 現在,您可以通過*(第一個元素的地址+ sizeof(int)來訪問它的值。這稱為指針算術。您必須參考一本好書以了解有關它的更多信息。
您為指針“ p”分配了指向本地數組“ a”的指針,因此從現在開始,“ p”和“ a”是同一數組,您對“ p”所做的每次更改都會直接影響“ a”,反之亦然。
p = &a[0];
在a [10]中,a是一個指針,它指向數組的第一個元素的地址。 因此,當您分配時:
p = &a[0];
P還在a處存儲相同的地址,並指向相同的元素。 因此,對p進行的任何操作都將反映在a中。
當你寫p =&a [0]; 與p = a相同; 現在p和a是同一數組開頭的指針
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.