Zunächst gibt es drei Möglichkeiten, ein struct als Funktionsparameter zu übergeben:
Die erste ist die Übergabe einer struct-Variablen, also Wertübergabe; die zweite ist die Übergabe eines struct-Zeigers, also Adressübergabe; die dritte ist die Übergabe von struct-Membern, was natürlich sowohl Wert- als auch Adressübergabe umfasst.
Die Übergabe eines struct per Referenz ist effizienter als die Übergabe per Wert. Die Übergabe eines struct per Wert erfordert das Anlegen einer Kopie der gesamten Struktur.
Unten steht ein Beispiel. Die student-struct enthält verschiedene Informationen über den Studenten. Wir ändern einen Teil davon in der change-Funktion und geben anschließend das Ergebnis in der main-Funktion aus.
1. Übergabe von struct-Variablen (siehe unten)
#include<stdio.h>
#include<string.h>
#define format "%d\n%s\n%f\n%f\n%f\n"
struct student
{
int num;
char name[20];
float score[3];
};
void change( struct student stu );
int main()
{
struct student stu;
stu.num = 12345;
strcpy(stu.name, "Tom");
stu.score[0] = 67.5;
stu.score[1] = 89;
stu.score[2] = 78.6;
change(stu);
printf(format, stu.num, stu.name, stu.score[0], stu.score[1],stu.score[2]);
printf("\n");
return 0;
}
void change(struct student stu)
{
stu.score[0] = 100;
strcpy(stu.name, "jerry");
}

Es ist zu sehen, dass sich der endgültige Ausgabewert nicht geändert hat...
2. Adressübergabe
#include<stdio.h>
#define format "%d\n%s\n%f\n%f\n%f\n"
struct student
{
int num;
char name[20];
float score[3];
};
void change( struct student* stu );
int main()
{
struct student stu;
stu.num = 12345;
strcpy(stu.name, "Tom");
stu.score[0] = 67.5;
stu.score[1] = 89;
stu.score[2] = 78.6;
change(&stu);
printf(format, stu.num, stu.name, stu.score[0], stu.score[1],stu.score[2]);
printf("\n");
return 0;
}
void change(struct student* p)
{
p->score[0] = 100;
strcpy(p->name, "jerry");
}

Es ist zu sehen, dass die Daten in dem struct durch Adressübergabe geändert wurden.
Verwende &stu als aktuelles Argument; &stu ist die Adresse der struct-Variablen stu. Beim Aufruf der Funktion wird diese Adresse an den formalen Parameter p übergeben (p ist eine Zeigervariable). Auf diese Weise zeigt p auf stu.
In der change-Funktion werden die Werte der struct-Member geändert, und die main-Funktion gibt die geänderten Werte aus.
3. Adressübergabe und Wertübergabe von struct-Membern
Dies ähnelt der Übergabe einer einzelnen Variablen, daher muss nicht weiter darauf eingegangen werden; natürlich kann nur die Adressübergabe den Wert ändern.
Das Übergeben einer vollständigen struct-Variable als Parameter erfordert das Übergeben aller Member-Werte nacheinander, was Zeit und Speicher verbraucht und einen hohen Overhead hat. Wenn der struct-Typ viele Member hat oder einige Member Arrays sind, wird die Ausführungseffizienz des Programms stark verringert. In diesem Fall ist es besser, einen Zeiger als Funktionsparameter zu verwenden, was die Laufzeiteffizienz verbessern kann.
Originaladresse: https://blog.csdn.net/lin37985/article/details/38582027