簡體   English   中英

指向整數數組的指針在C中如何工作?

[英]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
}
  1. 我嘗試在LINE B上寫int (*b)[5] = a ,但是沒有用。 誰能解釋為什么這行不通? 我雖然陣列為什么我需要明確采取的地址衰變成指針,所以我不是很了解a通過&a 這就像a已經是一個指針,因為它腐爛,但現在我需要一個指針的地址? 雙指針? ??

  2. 誰能解釋(*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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM