Frage

Unten ist ein Ausschnitt aus dem Buch C Programmierung nur die FAQs. Ist das nicht falsch, da Arrays niemals mit Referenz übergeben werden können?

Viii.6: Wie können Sie ein Array an eine Funktion nach Wert übergeben?

Antworten: Ein Array kann durch den Wert an eine Funktion übergeben werden, indem in der aufgerufenen Funktion den Array -Namen mit quadratischen Klammern deklariert werden ([ und ]) am Ende angeschlossen. Wenn Sie die Funktion aufrufen, senden Sie einfach die Adresse des Arrays (dh dem Namen des Arrays) an die aufgerufene Funktion. Zum Beispiel übergeht das folgende Programm das Array x[] zu der Funktion benannt byval_func() nach Wert:

Das int[] Parameter teilt dem Compiler mit, dass der byval_func()Die Funktion wird ein Argument erfolgen - ein Array von ganzen Zahlen. Wenn der byval_func() Die Funktion wird aufgerufen, Sie übergeben die Adresse des Arrays an an byval_func():

byval_func(x);

Da das Array mit Wert übergeben wird, wird eine genaue Kopie des Arrays hergestellt und auf den Stapel platziert. Die aufgerufene Funktion empfängt dann diese Kopie des Arrays und kann sie drucken. Weil das Array an überging byval_func() ist eine Kopie des ursprünglichen Arrays, das das Array innerhalb des Arrays modifiziert byval_func() Die Funktion hat keinen Einfluss auf das ursprüngliche Array.

War es hilfreich?

Lösung

Da das Array mit Wert übergeben wird, wird eine genaue Kopie des Arrays hergestellt und auf den Stapel platziert.

Das ist falsch: Das Array selbst wird nicht kopiert, Es wird nur eine Kopie des Zeigers auf seine Adresse an die Callee übergeben (platziert auf dem Stapel). (Unabhängig davon, ob Sie den Parameter als deklarieren int[] oder int*, es zerfällt zu einem Zeiger.) Auf diese Weise können Sie den Inhalt des Arrays innerhalb der aufgerufenen Funktion ändern. So ist dies

Da das an byval_func () übergebene Array eine Kopie des ursprünglichen Arrays ist, hat das Ändern des Array in der Funktion byval_func () keinen Einfluss auf das ursprüngliche Array.

ist einfach falsch (ein großes Lob an @jonathan Leffler für seinen Kommentar unten). Wenn Sie den Zeiger innerhalb der Funktion neu zuweisen, wird der Zeiger jedoch nicht in das ursprüngliche Array außerhalb der Funktion geändert.

Andere Tipps

Verbrenne dieses Buch. Wenn Sie eine echte C -FAQ möchten, die nicht von einem Anfängerprogrammierer geschrieben wurde, verwenden Sie diese: http://c-faq.com/aryptr/index.html.

Syntax- und streng genommen Sie Sie kann nicht Übergeben Sie ein Array nach Wert in C.

void func (int* x); /* this is a pointer */

void func (int x[]); /* this is a pointer */

void func (int x[10]); /* this is a pointer */

Jedoch, Für die Aufzeichnung gibt es einen schmutzigen Trick in C, der es Ihnen ermöglicht, ein Array nach Wert in C zu übergeben. Versuchen Sie dies nicht zu Hause! Denn trotz dieses Tricks gibt es immer noch nie einen Grund, ein Array nach Wert zu bestehen.

typedef struct
{
  int my_array[10];
} Array_by_val;

void func (Array_by_val x);

In C und C ++ ist es nicht möglich, einen vollständigen Speicherblock für Wert als Parameter an eine Funktion zu übergeben, aber wir dürfen seine Adresse übergeben. In der Praxis hat dies fast den gleichen Effekt und es ist viel schneller und effizienter.

Um sicher zu sein, können Sie die Arraygröße bestehen oder das CONT -Qualifikator vor dem Zeiger stellen, um sicherzustellen, dass die Callee sie nicht ändert.

#include<stdio.h>
void  fun(int a[],int n);
int main()
{
    int a[5]={1,2,3,4,5};
    fun(a,5);
}
void  fun(int a[],int n)
{
    int i;
    for(i=0;i<=n-1;i++)
        printf("value=%d\n",a[i]);
}

Nach dieser Methode können wir das Array nach Wert übergeben, aber tatsächlich zugreift das Array über die Basisadresse, die tatsächlich im Stapel kopiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top