Arrays standardmäßig als Referenz übergeben?

Lesezeit: 5 Minuten

Benutzer-Avatar
Johnbaker

Ich lese ein C++-Buch, in dem Folgendes steht:

C++ übergibt Arrays per Referenz an Funktionen – die aufgerufenen Funktionen können die Elementwerte in den ursprünglichen Arrays der Aufrufer ändern.

Es bezieht sich auf Situationen wie diese:

int hourlyTemperatures[ 24 ]; 
modifyArray( hourlyTemperatures, 24 );

Allerdings sind hier Vanilla-C-Array-Zeiger am Werk, richtig? Es wird keine C++ “Referenz”-Technik verwendet, was übergeben wird, ist a Zeiger nach Wert, in diesem Fall ein Zeiger auf das erste Element des Arrays. Das Endergebnis ist, dass die Funktion Zugriff auf das vollständige ursprüngliche Array hat, wie eine Referenz, aber dies ist nicht wirklich eine Referenzübergabe, richtig?

Aus diesem Buch von Prentice Hall:
Das betreffende Buch

  • Das Übergeben eines Arrays als Referenz erfordert einen Parameter vom Typ int (&)[24] (oder std::array<int, 24> &).

    – Chris

    14. Januar 2013 um 3:24 Uhr


  • Ja du hast recht, die Buch ist falsches spricht darüber, wie C-Arrays als Zeiger übergeben werden, und verwechselt “Pass by Reference” und “Pass Pointer by Value”.

    – Karthik T

    14. Januar 2013 um 3:25 Uhr


  • ^^ Stimmt. Schlechtes Buch ist schlecht.

    – Brian Roach

    14. Januar 2013 um 3:25 Uhr

  • Es ist nicht so, dass die Terminologie falsch ist, aber sie ist veraltet. Vor 20 Jahren wurde die Unterscheidung nicht gemacht.

    – Heiße Licks

    14. Januar 2013 um 3:46 Uhr

  • @HotLicks: Auch wenn es damals nicht falsch war, es ist jetzt.

    – Leichtigkeitsrennen im Orbit

    14. Januar 2013 um 4:56 Uhr


Benutzer-Avatar
bclehrmann

Es ist wahr, dass Sie, wenn Sie ein Array an eine Funktion übergeben, tatsächlich einen Zeiger als Wert übergeben. Ich bin jedoch der Meinung, dass Leute, die gerade C++ lernen, sich überhaupt keine Gedanken über Zeiger machen müssen. Sie lernen, dass Sie eine Variable als Wert oder als Referenz an eine Funktion übergeben können.

Durch Wert bedeutet, dass Änderungen an der Variablen in der Funktion den ursprünglichen Wert in der aufrufenden Funktion nicht beeinflussen.

Referenz bedeutet, dass, wenn die Funktion den Wert der Variablen ändert, diese Änderungen in der ursprünglichen aufrufenden Funktion sichtbar sind.

Wenn ein Array ein Parameter einer Funktion ist (ohne das Schlüsselwort const), werden alle Änderungen an den Werten im Array in der ursprünglichen aufrufenden Funktion angezeigt. Daher sagen wir, dass Arrays standardmäßig per Referenz übergeben werden. Dadurch wird vermieden, dass erklärt werden muss, was Zeiger sind, was beim Weitergeben statisch deklarierter Arrays wirklich nicht so relevant ist, aber es lässt die Leute wissen, dass diese Änderungen in der aufrufenden Funktion bestehen bleiben, wenn sie mit den Werten im Array in der aufgerufenen Funktion herumspielen .

Ich unterrichte einen “ersten Kurs” in C++ Informatik an einer erstklassigen Ingenieurschule (unser Programmierteam fährt dieses Jahr zu den World Finals in Russland). Ungefähr 90 % der Leute in der Klasse sind eigentlich keine Computerfachleute (hauptsächlich Maschinenbauingenieure). Das obige Material ist mehr als genug, um sie zu verwirren, ohne erklären zu müssen, was Zeiger sind. Aus diesem Grund erwähnen dieses Buch und andere, dass Arrays als Referenz übergeben werden, weil viele Leute, die die Bücher lesen, nur “gerade genug” C++ brauchen, um damit zurechtzukommen, ohne jedes kleine Detail lernen zu müssen. Diejenigen, die wirklich programmieren wollen, sollten kein Problem damit haben, zu der Tatsache überzugehen, dass Arrays wirklich per Zeiger übergeben werden.

Allerdings nur meine Meinung.

  • Ich stimme zu. Ein Teil dessen, was “Pass by Reference” bedeutet, ist wohl “implizit einen Zeiger auf das Argument übergeben, anstatt seinen Wert zu kopieren”, und genau das passiert, wenn Sie ein Array an eine Funktion in C übergeben. Ungefähr das einzige Mal, dass Sie dies tun können tatsächlich Erkennen Sie den Unterschied, wenn Sie den Parameter als Argument verwenden Größe von oder wenn Sie Arithmetik darauf anwenden (was natürlich ungültig wäre, wenn es sowieso ein Array wäre). Daher können C-Arrays, abgesehen von einigen geringfügigen undeutlichen Details, als per Referenz übergeben betrachtet werden.

    – davmac

    1. November 2015 um 20:09 Uhr

Benutzer-Avatar
Leichtigkeitsrennen im Orbit

Sie haben Recht. Die Formulierung ist sehr verwirrend und verwendet eine Bedeutung von “Referenz”, die nicht mit dem Begriff identisch ist Hinweis bezieht sich auf das gleichnamige C++-Feature. Stattdessen geht es um die Art und Weise, wie Array-Namen zu Zeigern zerfallen – tatsächlich „übergibt“ man so ein Array überhaupt nicht!

In den „alten Tagen“ wurde „Referenz“ in einem allgemeineren Sinne auf die gleiche Weise wie „Handle“ verwendet – ein abstrakter Begriff, der die Verwendung von Indirektion zur Fälschung von Referenzsemantik in Sprachen darstellt, die dies nicht unterstützten. Aber C++ tut Dinge unterstützen, die es anruft Verweise; Daher neigen wir dazu, “Referenz” nicht im Sinne von “Handle” zu verwenden, wenn wir über C++ sprechen (where Deitel ∉ “wir”offenbar).

Literatur-Empfehlungen:

Jedes andere C++-Buch Seien Sie sehr vorsichtig!! Obwohl es in den meisten Lebensbereichen verrückt wäre zu behaupten, dass die Aufnahme in die beiden oben genannten spezifischen Listen eine definitive Voraussetzung dafür ist, dass ein Buch als “gut” gilt, gibt es eine ausreichende Fülle von gefährlich falschem C++-Text da draußen (wie der Text, den Sie zitieren) und dies ist ein ausreichend großes Problem für unsere Sprachneulinge, dass es in der Welt der C++-Bücher eigentlich eine gute Faustregel ist.

  • +1, danke, dass Sie sich die Zeit genommen haben, eine bessere Antwort auf eine “fertige” Frage zu schreiben

    – Kartoffelklatsche

    14. Januar 2013 um 5:10 Uhr

  • @Potatoswatter: Es ist nie fertig, bis ich es bekomme mein sagen 😉 😉

    – Leichtigkeitsrennen im Orbit

    14. Januar 2013 um 5:13 Uhr

  • Vielen Dank; geschaltete akzeptierte Antwort, da die zusätzlichen Ressourcen sehr nützlich sind.

    – Johannesbäcker

    14. Januar 2013 um 10:17 Uhr

Benutzer-Avatar
Karthik T

Um meinen Kommentar zusammenzufassen, Sie haben vollkommen Recht!

Das Buch ist falsch in seiner Wortwahl. Es versucht, über Arrays zu sprechen, die zu C-Zeigern zerfallen. Es bezieht sich auf Übergabe dieses Zeigers als Wert wie als Referenz übergeben was falsch ist.

Dies ist ein weit verbreitetes Missverständnis, ich glaube, mir wurde auch so beigebracht (Übergabe des Zeigers als Wert == Übergabe als Referenz). Dies ist in Bezug auf C++-Referenzen und Referenzübergabe völlig falsch.

Wenn dies richtig wäre, Ich wäre nicht in der Lage, dies zu tun..

void ModifyMyArray(int *array){
   int oops[4]= {0};
   array = oops;

   array[2] = 1;
}
...
int MyArray[4] = {1,3,5,7};

ModifyMyArray(MyArray);

Ähnlich wie bei dieser Frage in Java – Ist Java “Pass-by-Reference” oder “Pass-by-Value”?

1358640cookie-checkArrays standardmäßig als Referenz übergeben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy