2012-05-25 43 views
6

Qual è la differenza tra:C++ * vs [] come parametro di funzione di

void foo(item* list) 
{ 
    cout << list[xxx].string; 
} 

e

void this(item list[]) 
{ 
    cout << list[xxx].string; 
} 

Supponendo oggetto è:

struct item 
{ 
    char* string; 
} 

Con il puntatore che punta al prima di una serie di caratteri

e list è solo una serie di articoli ...

risposta

8

Al compilatore non c'è differenza.

Si legge tuttavia diverso. [] suggerisce di voler passare un array alla funzione, mentre * potrebbe anche significare solo un semplice puntatore.

Si noti che gli array decadono ai puntatori quando vengono passati come parametri (nel caso in cui non lo sapessi già).

+0

+1 a "nota che gli array decadimento ai puntatori quando passate come parametri". Non lo sapevo, interessante sapere. – Drise

+0

Non solo le espressioni dell'array decadono per i puntatori, quando si specifica un tipo di array come parametro di funzione, esso viene effettivamente modificato in un tipo di puntatore per tutti gli scopi, inclusi overloading, 'sizeof' e' decltype'. Puoi persino dichiararlo in un modo e definirlo in un modo diverso (ma probabilmente non dovresti farlo). – aschepler

+1

Sarebbe bene aggiungere il testo dallo standard, in modo da non dare a nessuno l'impressione che array e puntatori siano gli stessi in generale. I parametri di funzione sono solo un caso speciale in cui lo stato standard "Dopo aver determinato il tipo di ciascun parametro, qualsiasi parametro di tipo" array di T "[...] viene regolato per essere" puntatore a T "[...]." [dcl.fct] 8.3.5/5. – bames53

3

Sono uguali - completamente sinonimi. E il secondo è item list[], non item[]list.

Tuttavia è consuetudine utilizzare [] quando il parametro viene utilizzato come un array e * quando viene utilizzato come un puntatore.

1

proposito:

void foo(int (&a)[5]) // only arrays of 5 int's are allowed 
{ 
} 

int main() 
{ 
    int arr[5]; 
    foo(arr); // OK 

    int arr6[6]; 
    foo(arr6); // compile error 
} 

ma foo(int* arr), foo(int arr[]) e foo(int arr[100]) sono tutti equivalenti

Problemi correlati