Nach diesem Kommentar habe ich versucht zu googeln, warum, aber mein google-fu ist fehlgeschlagen.
Kommentar vom Link:
[...] Wichtig ist jedoch, dass Arrays und Zeiger in C unterschiedliche Dinge sind.
Angenommen, Sie verwenden keine Compilererweiterungen, können Sie im Allgemeinen kein Array selbst an eine Funktion übergeben, aber Sie können einen Zeiger übergeben und einen Zeiger indizieren, als wäre er ein Array.
Sie beschweren sich effektiv darüber, dass Zeiger keine Länge haben. Sie sollten sich darüber beschweren, dass Arrays nicht als Funktionsargumente übergeben werden können oder dass Arrays implizit zu Zeigern degradiert werden.
Antworten:
Meine erste Vermutung für den Grund war einfach aus Gründen der Leistung und der Speicherersparnis sowie der Einfachheit der Compiler-Implementierung (insbesondere für die Art von Computern zu der Zeit, als C erfunden wurde). Das Übergeben von großen Arrays "nach Wert" schien eine enorme Auswirkung auf den Stack zu haben. Für jeden Funktionsaufruf ist ein vollständiger Array-Kopiervorgang erforderlich, und wahrscheinlich muss der Compiler intelligenter sein, um den korrekten Assembly-Code auszugeben (obwohl der letzte Punkt fraglich ist). . Es wäre auch schwieriger, dynamisch zugewiesene Arrays auf dieselbe Weise wie statisch zugewiesene Arrays zu behandeln (unter dem Gesichtspunkt der Syntax der Sprache).
BEARBEITEN: Nachdem ich einige Teile dieses Links gelesen habe , denke ich, dass der wahre Grund (und der Grund, warum Arrays in Strukturen als Werttypen behandelt werden, während es keine einzigen Arrays sind) die Abwärtskompatibilität zu Cs Vorgänger B ist . Hier ist das Zitat von Dennis Ritchie:
quelle
struct Foo { int array[N]; }
kann als Wert übergeben werden. Und der letzte Teil der Behandlung dynamischer und statischer Zuordnungen scheint faul zu sein (ein Array im engeren Sinne enthält immer eine Größe, die einheitlichen Konzepte für Dinge wie die Array-Indizierung sind Zeiger, die mit dem Zerfall von Arrays zu Zeigern gekoppelt sind ).Ein PDP-Minicomputer mit nur 8 kB Speicher kann keinen sehr großen Stapel zuordnen. Auf einer solchen Maschine muss man also beim Design (oder der Entwicklung) einer Sprache vorsichtig sein, um zu minimieren, was für die erwartete Verwendung gemeinsamer Unterprogrammaufrufe auf dem Stack gespeichert werden muss. C wird heute noch verwendet, um extrem speicherbeschränkte (einige kB) eingebettete Systeme zu programmieren, daher ist der Kompromiss normalerweise ein guter.
Bei einer Prozessorarchitektur mit nur sehr wenigen Registern kann durch häufiges Übergeben eines Arrays nach Zeiger und nicht nach Wert ein Register als Subroutinen-Aufrufoptimierung verwendet werden.
quelle