Tablica tablicy zanika w wskaźniku na swój pierwszy element w większości kontekstów. Tak więc, gdy napiszesz
, nazwa arr
rozpada się na wskaźnik na int. Obie deklaracje są równoważne do nich:
void f(int *arr);
void g(int *arr);
Dwa miejsca w których nazwa nie próchnicy są w definicji tablicy i jako argument do sizeof
. Więc to oświadczenie w zakresie globalnym nie definiuje wskaźnik do int:
int arr[];
Wspominam ten konkretny jeden, ponieważ jest to łatwo pomylić się i taki, który jest trudny do wyśledzenia. Definiuje to tablicę, a nie wskaźnik, mimo że liczba elementów nie jest określona. Jest to błąd (ale taki, który nie musi być zdiagnozowany), aby odnosić się do arr
z innego pliku źródłowego jako int *arr;
.
Nie ma znaczenia, dopóki nie użyjesz odniesienia, wskaźnika do tablicy lub tablicy wielowymiarowej. – chris
Jest inny dla C i C++. C ma VLA. C++ ma szablony. –
* "Możemy przekazać tablicę jako zmienną w nagłówku funkcji C/C++, tak jak w *" - Nie. W twoim przykładzie funkcja dostaje wskaźnik do pierwszego elementu, a nie do tablicy. Spróbuj sam; 'sizeof arr == sizeof int *', zawsze. –