2014-07-20 49 views
0

看看這個例子:如何指向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 Bint (*b)[5] = a,但沒有奏效。任何人都可以解釋爲什麼這不起作用?我雖然陣列衰變成指針,所以我不明白爲什麼我需要通過&a明確地指出a的地址。這就像a已經是一個指針,因爲它腐爛了,但現在我拿一個指針的地址?雙指針?咦?

  2. 任何人都可以解釋如何(*b)[0]的作品?這就像我廢除b,它本身是一個指向5個整數數組的指針,但我以某種方式獲取它的第[0]個元素?這種情況下的[0]元素不是5個整數?我以某種方式結束了一個整數,但它打印1

我真的很困惑。謝謝。

+1

1)數組衰減爲指向其第一個元素的指針,而不是指向其自身的指針。2)如果取消引用「指向5個整數的指針」,則會得到一個「5個整數」,然後用'[0]'索引。 –

+0

只有在不是'sizeof','_Alignof'(C11),'&'(適用於您的情況)或數組初始值設定項中使用的字符串文字的操作數時,數組纔會衰減。 – mafso

+0

@mafso這不適用於'_Alignof',因爲'_Alignof'操作數是一個類型名稱,不能是一個表達式。草稿版本的c11有問題,並已在c11的發行版中得到更正。 – ouah

回答

2
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; 這就是爲什麼如果你通過一個遞增那麼它就會跳到元素的下一個地址,如下圖所示 它將計算如下:第1個要素+(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個整數),這意味着 當你添加一個到它,那麼它會嘗試指向下方

(&a+1)----->121 //101 + 1*sizeof(a) 

顯示未來5個integers.As那就是爲什麼在這一行int (*b)[5] = &a;沒有問題,但是當您嘗試​​ 它給出錯誤,因爲a是指向單個整數的指針,其中as(* b)[5]指向5個整數。您無法分配不兼容的指針類型。

-4

當您聲明 - int a [5]時 -​​ 編譯器使用'a'作爲內部存儲器的引用。 'a'本身不是一個變量。因此,& a不起作用。

+1

'a'是非常多的變量。 –

0

b是指向數組a的指針。提領b會給整個陣列a。因此,當您在表達式中使用*b時,它表示該解除引用的數組的名稱。由於數組名稱被轉換爲指向數組的第一個元素的指針,因此*b衰減爲指向a(或*b)的第一個元素。 *b在衰減後具有類型int *。因此(*b)[i]會給b指向的數組的元素

+0

沒有必要衰減到一個指針來使這項工作,數組索引的作品沒有它。 –

+1

@MarkRansom:就標準而言,完全是迂腐的,在這種情況下陣列衰減(參見C99,6.3.2.1 p3)。 –