2012-05-25 14 views
6

¿Cuál es la diferencia entre:C++ * vs [] como un parámetro de la función

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

y

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

Suponiendo artículo es:

struct item 
{ 
    char* string; 
} 

Con el puntero que apunta a la primero de una serie de caracteres

y list es solo una matriz de elementos ...

Respuesta

8

Para el compilador, no hay diferencia.

Aunque dice diferente. [] sugiere que desee pasar una matriz a la función, mientras que * también podría significar simplemente un puntero.

Tenga en cuenta que las matrices decaen a los punteros cuando se pasan como parámetros (en caso de que usted no lo sepa).

+0

1 para "Tenga en cuenta que la viste la caries a los punteros cuando se pasan como parámetros". No lo sabía, es interesante saberlo. – Drise

+0

Las expresiones de matriz no solo decaen a punteros, cuando se especifica un tipo de matriz como parámetro de función, en realidad se cambia a un tipo de puntero para todos los propósitos, incluida la sobrecarga, 'sizeof' y' decltype'. Incluso puede declararlo de una manera y definirlo de una manera diferente (pero probablemente no debería hacerlo). – aschepler

+1

Sería bueno agregar el texto del estándar, para evitar dar a cualquiera la impresión de que los arrays y punteros son los mismos en general. Los parámetros de función son solo un caso especial donde el estándar establece "Después de determinar el tipo de cada parámetro, cualquier parámetro del tipo" array of T "[...] se ajusta para que sea" puntero a T "[...]". [dcl.fct] 8.3.5/5. – bames53

3

Son lo mismo - completamente. Y el segundo es item list[], no item[]list.

Sin embargo, es costumbre utilizar [] cuando el parámetro se usa como una matriz y * cuando se utiliza como un puntero.

1

FYI:

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 
} 

pero foo(int* arr), y foo(int arr[])foo(int arr[100]) son todos equivalentes

Cuestiones relacionadas