2012-03-16 25 views
6

napisałem funkcję, która pobiera wskaźnik do tablicy w celu zainicjowania jego wartości:Wskaźnik do tablicy jako parametr funkcji

#define FIXED_SIZE 256 
int Foo(int *pArray[FIXED_SIZE]) 
{ 
/*...*/ 
} 

//Call: 

int array[FIXED_SIZE]; 
Foo(&array); 

I to nie kompiluje:

error C2664: 'foo' nie można przekształcić parametr 1 z 'int (* __ W64) [256],' do 'int * []'

Jednak zhakowałem to razem:

typedef int FixedArray[FIXED_SIZE]; 
int Foo(FixedArray *pArray) 
{ 
/*...*/ 
} 

//Call: 

FixedArray array; 
Foo(&array); 

I działa. Czego mi brakuje w pierwszej definicji? Myślałem, że dwa byłyby równoważne ...

Odpowiedz

13
int Foo(int *pArray[FIXED_SIZE]) 
{ 
/*...*/ 
} 

W pierwszym przypadku, pArray jest tablicą wskaźników, a nie wskaźnik do tablicy.

Trzeba nawiasów użyć wskaźnika do tablicy:

int Foo(int (*pArray)[FIXED_SIZE]) 

dostać to za darmo z typedef (ponieważ jest już rodzajem The * ma inne znaczenie). Inaczej mówiąc, ten rodzaj przychodzi z własnymi nawiasami.

Uwaga: doświadczenie pokazuje, że w 99% przypadków, gdy ktoś używa wskaźnika do tablicy, , mogli i powinni po prostu użyć wskaźnika do pierwszego elementu.

+0

Tak, wskaźnik do pierwszego elementu, jak również do rozmiaru (jeśli to konieczne, co prawdopodobnie jest). –

+0

Uderzyłeś mnie w to! – Mosby

0

Tablica zanika do wskaźnika. Działa więc w drugim przypadku. W pierwszym przypadku parametrem funkcji jest tablica wskaźników, ale nie wskaźnik do liczby całkowitej wskazujący na pierwszy element w sekwencji.

2

Jeden prosty rzeczą jest, aby pamiętać zasadę ruchu wskazówek zegara spirali, który można znaleźć na http://c-faq.com/decl/spiral.anderson.html

To by ocenić pierwszy być tablicą wskaźników. Drugi to wskaźnik do tablicy o stałym rozmiarze.

Powiązane problemy