Po tym komentarzu próbowałem google dlaczego, ale moje google-fu nie powiodło się.
Komentarz z linku:
[...] Ale ważne jest to, że tablice i wskaźniki to różne rzeczy w C.
Zakładając, że nie używasz żadnych rozszerzeń kompilatora, ogólnie nie możesz przekazać samej tablicy do funkcji, ale możesz przekazać wskaźnik i zindeksować wskaźnik tak, jakby był tablicą.
Skutecznie narzekasz, że wskaźniki nie mają dołączonej długości. Powinieneś narzekać, że tablice nie mogą być przekazywane jako argumenty funkcji lub że tablice degradują się pośrednio do wskaźników.
Odpowiedzi:
Moje pierwsze przypuszczenie było spowodowane po prostu wydajnością i oszczędnością pamięci, a także łatwością implementacji kompilatora (szczególnie w przypadku komputerów w czasie, gdy wynaleziono C). Przekazywanie ogromnych tablic „według wartości” wydawało się mieć ogromny wpływ na stos, wymaga operacji kopiowania pełnej tablicy dla każdego wywołania funkcji i prawdopodobnie kompilator musi być mądrzejszy, aby wyprowadzić poprawny kod zestawu (choć ostatni punkt jest dyskusyjny) . Trudniej byłoby również traktować tablice alokowane dynamicznie w taki sam sposób, jak tablice alokowane statycznie (z punktu widzenia składni języka).
EDIT: po przeczytaniu niektórych części z tego linku , myślę, że prawdziwym powodem (i dlatego tablice w elemencie traktowane są jako typy wartości, natomiast podeszwa tablice nie są) jest wsteczna kompatybilność z C poprzednik B . Oto cytat z Dennis Ritchie:
źródło
struct Foo { int array[N]; }
może być przekazane przez wartość. A ostatni fragment dotyczący traktowania przydziałów dynamicznych i statycznych to samo wydaje się podejrzany (tablica w najściślejszym sensie zawsze zawiera rozmiar, koncepcje ujednolicające dla takich rzeczy jak indeksowanie tablic są wskaźnikami połączonymi z rozkładem z tablicy na wskaźnik), czy mógłbyś to rozwinąć?Minikomputer PDP z zaledwie 8 kB pamięci nie może przydzielić bardzo dużego stosu. Tak więc na takim komputerze należy zachować ostrożność przy projektowaniu języka (lub ewolucji), aby móc zminimalizować to, co musi znaleźć się na stosie w celu spodziewanego typowego użycia wywołań podprogramów. C jest nadal używany do programowania systemów o bardzo ograniczonej pamięci (kilka kB), więc kompromis jest zwykle dobry.
W architekturze procesora, która ma bardzo mało rejestrów, przekazywanie dowolnej tablicy przez wskaźnik zamiast według wartości częściej pozwala na wykorzystanie rejestru jako optymalizacji wywołania podprogramu.
źródło