2012-05-25 13 views
6

Jaka jest różnica pomiędzy:C++ * vs [] jako parametr funkcji

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

i

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

Zakładając przedmiot jest:

struct item 
{ 
    char* string; 
} 

Z wskazując wskaźnik do pierwsza z tablic znaków

i list jest tylko tablicą elementów ...

Odpowiedz

8

Do kompilatora nie ma różnicy.

Brzmi jednak inaczej. [] sugeruje, że chcesz przekazać tablicę do funkcji, podczas gdy * może również oznaczać tylko prosty wskaźnik.

Uwaga że tablice wskaźników do próchnicy, gdy przekazywane jako parametry (w przypadku, gdy nie już wiem).

+0

+1 dla "Zauważ, że tablice wskaźników do próchnicy, gdy przekazywane jako parametry". Nie wiedziałem tego, co ciekawe. – Drise

+0

Wyrażenia tablicowe nie tylko ulegają rozpadowi do wskaźników, gdy określa się typ tablicy jako parametr funkcji, to faktycznie zmienia się na typ wskaźnika dla wszystkich celów, w tym przeciążanie, 'sizeof' i' decltype'. Możesz nawet zadeklarować go w jeden sposób i zdefiniować go w inny sposób (ale prawdopodobnie nie powinieneś). – aschepler

+1

Byłoby dobrze dodać tekst ze standardu, aby nie sprawić nikomu wrażenia, że ​​tablice i wskaźniki są ogólnie takie same. Parametry funkcji są tylko specjalnym przypadkiem, w którym standard stwierdza "Po określeniu typu każdego parametru, dowolny parametr typu" tablica T "[...] jest dostosowywany do" wskaźnika do T "[...]." [dcl.fct] 8.3.5/5. – bames53

3

one są takie same - całkowicie synonimami. A drugi to item list[], a nie item[]list.

Jednak zwykle używa się [], gdy parametr jest używany jak tablica i *, gdy jest używany jako wskaźnik.

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 
} 

ale foo(int* arr), foo(int arr[]) i foo(int arr[100]) są równoważne

Powiązane problemy