Jak działa przekazywanie statycznie przydzielonej tablicy przez referencję?
void foo(int (&myArray)[100])
{
}
int main()
{
int a[100];
foo(a);
}
Czy (&myArray)[100]
ma jakieś znaczenie lub po prostu składnia do przekazania dowolnej tablicy przez odwołanie? Nie rozumiem osobnych nawiasów, po których następują duże nawiasy. Dzięki.
Odpowiedzi:
Jest to składnia odwołań do tablicy - musisz użyć,
(&array)
aby wyjaśnić kompilatorowi, że chcesz odwoływać się do tablicy, zamiast (nieprawidłowej) tablicy odwołańint & array[100];
.EDYCJA: Trochę wyjaśnień.
Te trzy są różnymi sposobami zadeklarowania tej samej funkcji. Wszystkie są traktowane jako przyjmujące
int *
parametry, możesz przekazać do nich dowolną tablicę rozmiarów.Akceptuje to tylko tablice 100 liczb całkowitych. Możesz bezpiecznie używać
sizeof
nax
Jest to analizowane jako „tablica referencji” - co jest niezgodne z prawem.
źródło
int a, b, c; int arr[3] = {a, b, c};
?void foo(int & x[100]);
jest analizowany jako „tablica referencji”? Czy to dlatego, że zasada „od prawej do lewej”? Jeśli tak, wydaje się, że nie jest to zgodne z tym, jakvoid foo(int (&x)[100]);
jest analizowane jako „odwołanie do tablicy”. Z góry dziękuję.To tylko wymagana składnia:
^ Przekaż tablicę 100
int
przez odniesienie nazwa parametru tomyArray
;^ Przekaż tablicę. Tablica rozpada się na wskaźnik. W ten sposób tracisz informacje o rozmiarze.
^ Przekaż wskaźnik funkcji. Funkcja zwraca an
int
i przyjmuje adouble
. Nazwa parametru tomyFunc
.źródło
To jest składnia. W argumentach funkcji konieczny jest
int (&myArray)[100]
nawias, który&myArray
zawiera. jeśli ich nie użyjesz, zdaszarray of references
i to dlatego, żesubscript operator []
ma wyższy priorytet niż& operator
.Na przykład
int &myArray[100] // array of references
Tak więc, używając
type construction ()
, powiesz kompilatorowi, że chcesz odwołać się do tablicy 100 liczb całkowitych.Na przykład
int (&myArray)[100] // reference of an array of 100 ints
źródło
array of references
” - co oczywiście nie może istnieć, więc otrzymasz błąd kompilacji. Zabawne jest dla mnie, że reguły pierwszeństwa operatorów nalegają, aby tak się stało domyślnie.Tablice są domyślnie przekazywane przez wskaźniki. Możesz spróbować zmodyfikować tablicę w wywołaniu funkcji w celu lepszego zrozumienia.
źródło
char arr[1]; foo(char arr[]).
arr obniża się do wskaźnika; podczas używaniachar arr[1]; foo(char (&arr)[1])
arr jest przekazywany jako odniesienie. Warto zauważyć, że poprzednia forma jest często uważana za źle sformułowaną, ponieważ wymiar zostaje utracony.foo(T* t)
i masz tablicę,T a[N];
wtedy, gdy piszeszfoo(a);
, myślę, że bardziej poprawne byłoby powiedzenie, że przekazujesz wskaźnik, a nie tablicę, i przekazujesz wskaźnik według wartości.Następujące tworzy ogólną funkcję, przyjmując tablicę dowolnego rozmiaru i dowolnego typu przez odniesienie:
baw się kodem.
źródło