2009-11-24 2 views
25

Se si scrive una funzione C++ comeDifferenza tra [parentesi quadre] e * asterisco

 
void readEmStar(int *arrayOfInt) 
{ 
} 

vs una funzione C++ come:

 
void readEmSquare(int arrayOfInt[]) 
{ 
} 

Qual è la differenza tra l'utilizzo di [parentesi quadre] vs * asterisco, e qualcuno ha una guida di stile su quale è preferibile, supponendo che siano equivalenti al compilatore?

Per completezza, un esempio

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) ; 
} 

risposta

56

Quando si utilizza il tipo char x[] anziché char *xsenza inizializzazione, si può considerare loro la stessa. Non è possibile dichiarare un nuovo tipo come char x[] senza inizializzazione, ma è possibile accettarli come parametri per le funzioni. Nel qual caso sono uguali a puntatori.

Quando si utilizza il tipo char x[] invece di char *xcon l'inizializzazione, sono completamente diversi al 100%.


Esempio di char x[] è diverso da char *x:

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

sz è in realtà un array, non un puntatore.

assert(sizeof(sz) == 6); 
assert(sizeof(sz) != sizeof(char*)); 
assert(sizeof(p) == sizeof(char*)); 

Esempio di come char x[] è lo stesso char *x:

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

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

stile di codifica per il passaggio alle funzioni:

E 'davvero doe non importa quale fai. Alcune persone preferiscono char x[] perché è chiaro che si desidera che venga passato un array e non l'indirizzo di un singolo elemento.

Di solito questo è già chiaro, anche perché si avrebbe un altro parametro per la lunghezza dell'array.


Ulteriori approfondimenti:

Si prega di vedere questo post dal titolo Arrays are not the same as pointers!

+0

Dal vettori e puntatori sono abbastanza simili in C++ forse si potrebbe aggiungere un po 'veloce sulla quale sia la differenza (pila contro heap, ecc) – tloach

+0

in readEmSquare, controllando sizeof (arrayOfInt) restituirà 4, si tratta di un puntatore – bobobobo

+0

Vedere la mia nota su quando si utilizza char [] senza inizializzazione. –

3

Non c'è alcuna differenza tra le due codici, a parte il diverso stile, ovviamente. In entrambi i casi, la matrice viene passata per riferimento e non per valore, poiché i parametri di funzione type *x e type x[] sono semanticamente identici.

+4

Semanticamente uguale solo ai parametri di funzione. –

+0

Un array non è passato qui per riferimento (sì, in C++ è anche possibile passare array per riferimento). Invece la matrice, quando passata a una funzione, decade per puntare al primo elemento, che viene passato per valore. Nessuna differenza tra i codici, però. – UncleBens

-1

Le due espressioni sono equivalenti.Ognuno di essi valuta l'indirizzo del primo elemento dell'array arrayInf.

13

C++ standard 13.1.3

- dichiarazioni di parametri che differiscono solo in un puntatore * rispetto a un array [] sono equivalenti. Cioè, la dichiarazione dell'array viene regolata per diventare una dichiarazione puntatore (8.3.5). Solo le dimensioni del secondo e successivo sono significative nei tipi di parametro (8.3.4). [Esempio:

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 esempio]

+0

Buon esempio! Me lo stavo chiedendo .. quindi il numero viene scartato dal compilatore se lo si specifica, in pratica, a meno che non sia 2D o più, nel qual caso viene mantenuto solo l'ultimo numero. – bobobobo

1

Sulla questione stile attaccherò il mio collo fuori e dire int * arrayOfInt è meglio. Qualunque sintassi che usi, stai passando un puntatore e il tipo dovrebbe renderlo chiaro.

Questa è solo la mia opinione.

+0

Mi tirerò fuori il collo e sono d'accordo :) –

+2

Ragazzi il tuo collo sta mostrando – bobobobo

Problemi correlati