2017-07-17 18 views
5

C'deki bu ikisi arasındaki fark nedir? Birincisi, işaretçi dizisidir. Ana kafa karışıklığım ikinci deklarasyonla ilgili. Ne bildiriyor? İki aynı değil mi?Int (* ar) [] bildiriminin C cinsinden anlamı nedir?

int *p []={&i,&j,&k}; 

int (*ar) []; 
+0

"Ar ints bir dizi için bir işaretçi" "s işaretçiler bir dizi int için". Teşekkür ederim. – Neer

+2

["int göstergesinin dizisi olarak dec"] (https://cdecl.org/?q=int+*p+%5B%5D), ["int dizisine işaretçi olarak ar bildir"] (https://cdecl.org/?q=int+%28*ar%29+%5B%5D) – kay

+0

Benzer bir soru üzerinde [bu yanıt] 'a (https://stackoverflow.com/a/30345939/4265352) bir göz atın. – axiac

cevap

4

Bu ikisi aynı değil. İkincisi, int bir dizi için işaretçisidir.

Bir 2D dizisini parametre olarak geçirirken böyle bir bildirimi işlev parametresi olarak kullanabilirsiniz.

void f(int (*ar)[5]) // array size required here to do pointer arithmetic for 2D array 
{ 
    ... 
} 

Böyle diyebiliriz:

int a[5][5]; 
f(a); 

yerel parametre olarak başka örnek:

int a[5] = { 1,2,3,4,5 }; 
int (*ar)[]; // array size not required here since we point to a 1D array 
int i; 

ar = &a; 
for (i=0;i<5;i++) { 
    printf("a[%d]=%d\n", i, (*ar)[i]); 
} 

Çıktı:

a[0]=1 
a[1]=2 
a[2]=3 
a[3]=4 
a[4]=5 
+0

Çok teşekkür ederim, bir işlev içinde bildirilip kullanılabilir (parametre içinde değil)? Öyleyse neden böyle bir şeyi bir işlev içinde açıklayacak bir kapsam var. – Neer

+0

@Neer Evet yapabilirler. Örnek için düzenlememe bakın. – dbush

6
Örneğin, bu işlevi verilen

Sadece'ü takip edin

int *p []={&i,&j,&k}; // okur:

int (*ar) []; // dışarı Sorry.Edited