Übergeben Sie ein Array an eine Funktion nach Wert
-
23-10-2019 - |
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 Arrayx[]
zu der Funktion benanntbyval_func()
nach Wert:Das
int[]
Parameter teilt dem Compiler mit, dass derbyval_func()
Die Funktion wird ein Argument erfolgen - ein Array von ganzen Zahlen. Wenn derbyval_func()
Die Funktion wird aufgerufen, Sie übergeben die Adresse des Arrays an anbyval_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 modifiziertbyval_func()
Die Funktion hat keinen Einfluss auf das ursprüngliche Array.
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.