Array übergeben werden by-value oder by reference?
Weiß ich sicher, dass
function(int *a); function(int a[]);
in C sind die gleichen, function(int a[]) übersetzt werden in Funktion(int *a)
int *a = malloc(20);
int b[] = {1,2,3,4,5};
Diese beiden sind nicht das gleiche, das erste ist ein Zeiger, der zweite ist ein array. Was passiert, wenn ich call-Funktion(b)?(function(int *a))
Ich weiß, dass b auf dem Stapel, so wie Sie ist übergeben, die Funktion?
Zweitens, strings:
char *c1 = "string";
char c2 [] = "string";
In diesem Fall weiß ich nicht, wo ist c1, und ich nehme an, dass c2 auf dem Stapel.
Angenommen, die Funktion ist jetzt: die Funktion(char *c), welche der Funktion(char c[]), was passiert, wenn ich call-Funktion(c1) und die Funktion(c2), die strings übergeben werden, per Referenz oder Wert?
Ja, ich habe alles, was, die Sie erwähnt, aber jetzt versuche ich, um zu sehen, C durch die Montage der Brille.
Kompilieren Sie dann mit
Kompilieren Sie dann mit
gcc -Wall -fverbose-asm -S yourfile.c
dann schauen Sie in yourfile.s
InformationsquelleAutor AR89 | 2012-11-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einen entscheidenden Punkt zu machen, hier ist alles wirklich vergangen von Wert zum Beispiel, dies wird passieren eine Kopie von
a
zufoo()
(was ein Zeiger auf Speicher):Das ist, warum, wenn Sie etwas tun, wie dies in
foo()
es nicht wirklich ändern, die Zeigera
immain()
aber änderungen der lokale Kopie:In anderen Worten, Sie können
foo()
's lokale Kopiea
zum ändern der Speicher wies auf von 'a', aber nicht zu ändern, wasa
Punkte zu inmain()
.Nun, der pass etwas "by reference" übergeben Sie eine Kopie ein Zeiger-auf-Zeiger auf die Funktion (so etwas wie ein->b->Speicher):
So, wenn Sie zuweisen, um es in
foo()
, ändert sich der Zeiger inmain()
:Nun um die Beantwortung einiger deiner anderen Fragen, wenn Sie eine array-Namen es wird umgewandelt in einen Zeiger auf das erste element des Arrays:
Den letzten zwei Funktionsaufrufe sind äquivalent, da Sie beide übergeben Sie einen Zeiger auf das erste element mit einem Speicher, der Unterschied ist der Speicher für
a
ist reserviert auf dem heap, die Erinnerung anb
jedoch, ist auf dem Stapel reserviert.Schließlich, die Saiten, der folgenden ähnlich, dass das gleiche Prinzip gilt, jedoch der erste ist ein Konstante string-literal und sollte definiert werden als
const
und Sie sollten nicht zu ändern versuchen es überall, aber Sie können ändern, die zweite:func (int x)
ist von Wert undfunc (int* x)
ist unter Bezugnahme. Denn ob es ist von val oder ref hängt wirklich von der Absicht von der Funktion. Ansonsten kann man nur sagen, dass dein Beispielfoo(int **a)
nicht passieren etwas durch den Hinweis, es ist lediglich die übergabe eines Zeiger-auf-Zeiger durch Wert.Ich glaube, IMHO, dass, die sagen, dass etwas, was als Verweis übergeben wird, ist der Grund, warum alle Anfänger versuchen zu ordnen, um einen Zeiger innerhalb einer Funktion und erwarten, dass es änderungen, die es woanders ist.
Ein Anfänger ohne Programmierer Erfahrung, ist wohl weniger wahrscheinlich, das zu tun, als sagen wir ein Java-Programmierer lernen C. Sowieso, alle Anfänger auch versuchen, wieder einen Zeiger auf eine lokale variable aus einer Funktion. Ich fühle, dass unscharfe Begriffe wie "by reference", oder auch "Zeiger", ist nicht wirklich hilfreich für einen Anfänger ist es wahrscheinlich besser zu erklären, was Los ist in der binären unter der Haube.
InformationsquelleAutor iabdalkader
Aus der K&R2
Dem argument, Erklärung
char c2 []
ist nur syntaktischer Zucker fürchar* c2
.Alles in C übergeben bekommt als Wert. Für weitere Erklärung, diese verwenden Sie diese link.
Auch Eli Bendersky hat eine ausgezeichnete Artikel das gleiche zu diskutieren.
InformationsquelleAutor Shash
Wenn Sie übergeben Sie ein array an eine Funktion erwartet einen Zeiger, der auf die Referenz des Arrays "zerfällt" in einen Zeiger auf sein erstes element.
http://c-faq.com/aryptr/aryptrequiv.html
Den tatsächlichen übergabe an die Funktion per Referenz, die erfolgt durch den compiler, indem Sie die Adresse (pointer) auf dem stack oder in einem CPU-register.
Strings sind keine Ausnahme, da Sie lediglich arrays von Zeichen.
Ja, aber ich bin versucht, irgendeine Art von pädagogischen Vereinfachung. Nur die Antwort "alles, was von Wert übergeben wird" nicht gehen, um das Leben leichter machen für alle Anfänger-Programmierer.
Danke für die Antwort, aber ich war auf der Suche für eine genauere Erklärung, ich bin ein Anfänger mit C, aber ich hab schon Erfahrung mit Montage-und Java habe ich versucht zu sehen, die Korrespondenz zwischen der C-Funktion aufruft und Montage-Verfahren.
Dann sollten Sie vielleicht gemacht haben, klar in der Frage...
Ich hatte nicht erwartet, zu erhalten, eine pädagogische Vereinfachung, ich werde es in Zukunft Fragen btw.
InformationsquelleAutor Lundin
char c2[] = "string"
es nicht im readonly-Speicher.string wird auf
readonly
eine Kopie kopiertc2
array auf dem stack.Das ist eine Möglichkeit es zu implementieren, aber du redest über die Umsetzung details. Das Endergebnis ist etwas, was nicht im readonly-Speicher.
Technisch ist das literal "string" wird immer in nur-lese-Speicher, aber der compiler ist frei, optimieren Sie Ihre Zuordnung, und nur Speicherplatz für c2. Das heißt, wenn der compiler geschrieben ist eine Reine RAM-basierten system wie ein PC. Sonst nichts, was getan werden kann, und das string-literal zugewiesen werden müssen, in ROM.
Technisch gesehen gibt es keine Vorschrift, dass nur-lese-Speicher vorhanden sind (ich kann mir denken, ein paar C-Implementierungen, die es nicht haben), das einzige, was wir sicher sein können, dass
c2
ist nicht in nur-lese-Speicher.InformationsquelleAutor Omkant
Wenn Ihr denken, es ist Call-by-Value dann versuchen Sie dies ausführen:
In beiden bubbleSort() und displayArray() nach bubblesort () - Aufruf, zeigen gleiche Ergebnisse.
Wenn Sie die call-Funktion(a) wenn a ein array ist, wird es tatsächlich passieren die Basis-Adresse ein. Also, es ist im Grunde Call-by-Ref.
Auch,
sind genau die GLEICHEN !
In beiden Fällen, c Punkte auf das erste element in der Zeichenfolge. Auch der 1. string ist NICHT und ich meine NICHT konstant. Versuchen Sie, es zu ändern. Es wird.
InformationsquelleAutor Nikhil Prasad
Die arrays per Referenz übergeben, warum ? denn Sie übergeben die Zeiger-Adresse von Wert so dass die änderung auf, dass der Mauszeiger ändert sich, auf der wies Speicher, nicht den Zeiger Adresse selbst, so dass eine änderung der Zeiger wird nicht ersetzen die original-Zeiger aus der Funktion, so, wenn Sie Typ a = ANOTHER_POINTER innerhalb dieser Funktion wird es nicht der Verlust der übergebenen array nach der Verwendung der Funktion
int a[] entspricht int eine und beim Aufruf der Funktion foo(int a) es wird die pointer-Adresse
nun, wenn Sie möchten, ändern Sie den Zeiger, er selbst übergeben Sie dem Zeiger die Adresse von Referenz foo(int *& a), so ändert sich jetzt auf den Zeiger-Adresse a = ANOTHER_POINTER ändern wird, die Adresse des Zeigers
Nein, Sie können nicht übergeben Sie die pointer-Adresse, die durch die C++ - Referenz-Mechanismus in C-Sprache.
foo(int *& a)
wird nicht kompiliert.danke für die Informationen
InformationsquelleAutor Omar Freewan
Arrays werden immer per Referenz übergeben (pointer).
Wenn Sie möchten, übergeben Sie Sie mit dem Wert, Kapseln Sie in einer
struct
. Das ergäbe Betriebssystem auf einer Kopie des ursprünglichen Arrays. Das Beispiel unten gezeigt:Das erste argument foo struct-Objekt, das enthält eine Kopie des Arrays. Zweite argument ist array-Referenz.
InformationsquelleAutor anishsane