2009-11-24 23 views
25

Bir C yazarsanız ++ işlev * yıldız ve derleyiciye eşdeğer olduklarını varsayan herkesin tercih edilebileceği bir stil kılavuzu var mı? Bütünlüğü için[köşeli parantez] arasındaki fark ve * yıldız

, bir örnek

void readEmStar(int *arrayOfInt, int len) 
{ 
    for(int i = 0 ; i < len; i++) 
    printf("%d ", arrayOfInt[i]) ; 
    puts(""); 
} 


void readEmSquare(int arrayOfInt[], int len) 
{ 
    for(int i = 0 ; i < len; i++) 
    printf("%d ", arrayOfInt[i]) ; 
    puts(""); 
} 

int main() 
{ 
    int r[] = { 2, 5, 8, 0, 22, 5 } ; 

    readEmStar(r, 6) ; 
    readEmSquare(r, 6) ; 
} 

cevap

56

Eğer başlatma olmadan char x[] yerine char *xtipini kullanmak, onlara aynı düşünebilirsiniz. Yeni bir türü, başlatılmadan char x[] olarak bildiremezsiniz, ancak bunları işlevler olarak parametre olarak kabul edebilirsiniz. Bu durumda işaretçilerle aynıdır.

Eğer tip char x[] yerine başlatma ile char *x kullanımı

, tamamen% 100 farklıdır. char x[]char *x farklıdır nasıl


Örnek:

char sz[] = "hello"; 
char *p = "hello"; 

sz aslında bir dizi, bir işaretçidir.

void test1(char *p) 
{ 
    assert(sizeof(p) == sizeof(char*)); 
} 

void test2(char p[]) 
{ 
    assert(sizeof(p) == sizeof(char*)); 
} 

işlevlerine geçme tarzı Kodlama:

Gerçekten doe char x[] aynı char *x gibidir nasıl


Örnek

assert(sizeof(sz) == 6); 
assert(sizeof(sz) != sizeof(char*)); 
assert(sizeof(p) == sizeof(char*)); 
Hangisini yaptığın önemli değil. Bazı insanlar, char x[]'u tercih eder, çünkü bir dizinin tek bir öğenin adresini değil, girilmesini istediğiniz açıktır.

Genellikle bu zaten anlaşılır, çünkü dizinin uzunluğu için başka bir parametreniz olur.


fazla okuma:

hiçbir fark dışında açıkçası farklı tarzı, sizin iki kodları arasında bulunmaktadır Arrays are not the same as pointers!

+0

diziler ve işaretçileri belki sizeof (arrayOfInt) 4 dönecektir kontrol readEmSquare içinde (vb yığın vs yığını) fark edilir ne – tloach

+0

hızlı bir bit eklenebilir C++ oldukça benzer olduğundan, bir işaretçi – bobobobo

+0

olduğunu Başlatma olmadan char [] kullandığınız zaman hakkındaki notuma bakın. –

3

başlıklı bu yazıyı bakın. Her iki durumda da, type *x ve type x[] fonksiyon parametreleri semantik olarak aynı olduğundan, dizi referans ile değil, değere göre geçirilir.

+4

Anlamsal olarak sadece işlev parametreleriyle aynıdır. –

+0

Bir dizi buraya referans olarak aktarılmamıştır (evet, C++ 'da dizileri referans olarak iletmek de mümkündür). Bunun yerine, bir işleve iletildiğinde dizi, değerle geçirilen ilk öğeye işaretçiyi bozar. Yine de kodlar arasında fark yok. – UncleBens

-1

İki ifade eşdeğerdir.Her biri dizi arrayOfInt öğesinin ilk öğesinin adresini değerlendirir.

13

C++ Standart 13.1.3

- sadece bir dizi [] karşı bir işaretçi * içinde farklı parametre bildirimleri eşdeğerdir. Yani, bildirimi dizisi, işaretçi bildirimi (8.3.5) olacak şekilde ayarlanır. Yalnızca saniye ve sonraki dizi boyutları , (8.3.4) parametre türlerinde önemlidir. [Örnek:

int f(char*); 
int f(char[]); // same as f(char*); 
int f(char[7]); // same as f(char*); 
int f(char[9]); // same as f(char*); 
int g(char(*)[10]); 
int g(char[5][10]); // same as g(char(*)[10]); 
int g(char[7][10]); // same as g(char(*)[10]); 
int g(char(*)[20]); // different from g(char(*)[10]); 

-end örnek] stil soruya ben kendimi riske atmam ve int * arrayOfInt iyidir söylerim On

+0

İyi örnek! Bunu merak ettim .. bu nedenle, eğer derleyici, eğer 2B veya daha fazlası değilse, temelde, sadece son numara tutulursa, derleyici tarafından atılır. – bobobobo

1

. Hangi sözdizimini kullanırsanız kullanın, bir işaretçiyi geçiriyorsunuz ve bu tür yazıyı açıklığa kavuşturmalı.

Bu sadece benim düşüncem.

+0

Boynumun dışına çıkacağım ve katılıyorum :) –

+2

Adamların boyunları gösteriliyor – bobobobo

İlgili konular