ProgrammierungSystemprogrammierer

Könnten Sie ausführlich die Mechanismen der Parameterübergabe in Funktionen der Programmiersprache C erläutern: durch Wert und durch Zeiger? Nennen Sie Beispiele, wann die Verwendung jedes Ansatzes gerechtfertigt ist.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

In der Programmiersprache C werden die Parameter in Funktionen immer durch Wert übergeben — das bedeutet, eine Kopie des Wertes aus dem aufrufenden Code wird in die Funktion übergeben. Wenn der Wert einer Variablen außerhalb der Funktion geändert werden soll, wird die Übergabe durch einen Zeiger verwendet.

Übergabe durch Wert

Bei der Übergabe eines Skalars (zum Beispiel int) erhält die Funktion ihre Kopie:

void foo(int a) { a = 10; } int main() { int x = 5; foo(x); // x == 5, wird nicht geändert! }

Übergabe durch Zeiger

Um den Wert einer Variablen zu ändern, wird ein Zeiger verwendet:

void foo(int* a) { *a = 10; } int main() { int x = 5; foo(&x); // x == 10, Wert wurde geändert! }

Wann Zeiger verwenden

  • Mehrere Werte zurückgeben müssen.
  • Große Strukturen ändern (Zeit- und Speicherersparnis, kein Kopieren).
  • Arbeiten mit Arrays (diese werden immer als Zeiger übergeben).

Fangfrage.

Ist ein Array ein Parameter der Funktion, der durch Referenz übergeben wird?

Viele antworten, dass es "durch Referenz" ist, jedoch kann in C ein Array in der Funktionssignatur nicht durch Referenz übergeben werden, tatsächlich degradiert es zu einem Zeiger.

Richtige Antwort:

Wenn ein Array in eine Funktion übergeben wird, wird tatsächlich ein Zeiger auf sein erstes Element übergeben. Das bedeutet, dass die aufgerufene Funktion die tatsächliche Größe des Arrays nicht kennt und alle Änderungen der Array-Elemente auf das ursprüngliche Array zurückwirken.

void foo(int arr[]) { arr[0] = 100; } int main() { int a[3] = {1,2,3}; foo(a); // a[0] wird 100 sein! }

Geschichte


In einem Projekt aktualisierte eine Funktion die Werte eines Arrays, das als int arr[10] deklariert war, aber im aufrufenden Code war das Array kleiner. Da die Funktion die tatsächliche Größe nicht kannte, kam es zu einem Buffer-Überlauf und zu Speicherbeschädigungen.


In einem anderen Fall wurde durch die Übergabe einer Struktur durch Wert in die Funktion ein großer Speicherblock mehrmals kopiert, was zu einem Einbruch der Anwendungsleistung führte.


Der Entwickler erwartete, dass die Übergabe eines Skalars "durch Referenz" (über einen Zeiger) die Unveränderlichkeit des ursprünglichen Wertes gewährleistet, änderte aber versehentlich im Zeiger den Speicher außerhalb des Gültigkeitsbereichs (Fehler in der Zeigerarithmetik), was zu unvorhersehbaren Ergebnissen führte.