2014-12-14 16 views
5

Potrzebujesz trochę pomocy w zrozumieniu, co dokładnie dzieje się w tym fragmencie kodu. Kiedy uruchamiam program drukuje 7.Opis macierzy C i wskaźników

#include <stdio.h> 
int main() { 
int a[] = {1,2,3,4,5,6,7,8,9}; 
int b[] = {1,2,3,4,5,6,7,8,9}; 
int c = 5; 
int *p = a; 
printf("--> %d", (c[b])[p]); 
return 0; 
} 

jestem trochę zdezorientowany, gdy chodzi o (c [b]) [p] udział w instrukcji printf. Każda pomoc/wyjaśnienie byłaby bardzo doceniana.

+3

'c [b]" oznacza to samo co '* (c + b)'. To powinno pomóc. – bzeaman

+0

Możliwy duplikat [Czy nazwa tablicy jest wskaźnikiem w C?] (Http://stackoverflow.com/questions/1641957/is-array-name-a-pointer-in-c) – jww

+0

@BennoZeeman Nie pamiętasz nawiasów. Są ważne. tj. zobacz aktualną odpowiedź. –

Odpowiedz

13

To trochę dziwne, że tak się pisze, ale operator [] w C jest przemienny. Oznacza to, że (c[b])[p] jest taka sama jak p[b[c]], który jest o wiele łatwiejsze do zrozumienia:

p[b[c]] = p[b[5]] = p[6] = a[6] = 7 

robi to samo z oryginalnego wyrazu działa zbyt, to po prostu nieco dziwne patrzeć w miejscach:

(c[b])[p] = (5[b])[p] = (b[5])[p]) = 6[p] = p[6] = a[6] = 7 

przemienności (jeśli to słowo) z [] to tylko ze względu na jego definicji - to znaczy a[b] jest taka sama jak *(a + b), gdzie można zobaczyć kolejność a i b nie ma znaczenia.

Powiązane problemy