2012-10-29 12 views
5

Możemy przekazać tablicę jako zmienną w C nagłówka funkcji/C++, jak wC/C zmienna ++ tablica w nagłówku funkcji

int func(int arr[]) { ... } 

zastanawiam się: Czy to możliwe, że coś idzie wewnątrz [] w zmiennej, która jest przekazywana do nagłówka funkcji, czy zawsze jest pusta?

+1

Nie ma znaczenia, dopóki nie użyjesz odniesienia, wskaźnika do tablicy lub tablicy wielowymiarowej. – chris

+0

Jest inny dla C i C++. C ma VLA. C++ ma szablony. –

+1

* "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. –

Odpowiedz

10

dla dowolnego (bez odniesienia) typu T podpisy funkcyjne R foo(T t[]) i R foo(T t[123]) (lub dowolna inna liczba) są identyczne R foo(T * t) i baterie są przekazywane przez podanie adresu pierwszego element.

Należy pamiętać, że T może sam być typem tablicy, na przykład T = U[10].

+1

+1 za abstrakcję. Nigdy tego nie słyszałem, ale jest dobrze. – chris

2

do jednowymiarowej tablicy, to zawsze będzie pusta, wsporniki są kolejnym sposobem na piśmie:

int fun(int * arr) 
{ 

} 

Jak dla dwuwymiarowej tablicy, trzeba określić, jak wiele elementów, każdy sam element posiada

int fun(int arr[][3]) 
{ 

} 
+2

Może mieć numer między nawiasami, nawet jeśli jest jednowymiarowy, kompilator po prostu je ignoruje. – imreal

2

int func (int arr []) {...} to nieprawidłowa deklasyfikacja tablicy przekazanej do funkcji.

Nazwa tablicy jest zmienną wskaźnika. więc wystarczy, że po prostu przekazujemy nazwę tablicy (która sama jest wskaźnikiem)

int func (int * arr) {...} przekaże adres początkowy tablicy do funkcji, aby mogła użyj tablicy.

jeśli oryginalna tablica musi pozostać nienaruszona, można utworzyć kopię tablicy & używaną w ramach tej funkcji.

+0

Nieprawda. To jest prawidłowy kod. – Acorbe

0

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;.