====== Zeiger auf Strukturen ====== Wir betrachten die Struktur ''Student'' und definieren einen Zeiger darauf. // Pointer at structure { struct Student { ... }; Student peter, *pg; // init peter ... pg = &peter; // pointer at peter cout << (*pg).vorname; // conventional access cout << pg->vorname; // better access ... } ++++ gesamtes Programm| // Dynamic array of type student #include using namespace std; int main() { struct Student { long long int matrikel; int skz; char name[30], vorname[20]; }; int i, n; Student *gruppe, *pg; // pointer at Student cout << endl; cout << " How many Students : "; cin >> n; // input n gruppe = new Student[n]; // allocate memory for (i = 0; i < n; i++) { cout << endl << "Student nr. " << i << endl; cout << "Familenname : "; cin >> gruppe[i].name; cout << "Vorname : "; cin >> (gruppe+i)->vorname; cout << "Matrikelnummer : "; cin >> gruppe[i].matrikel; cout << "SKZ : "; cin >> gruppe[i].skz; } cout << endl; i = 3; if ( i < n) { cout << endl; cout << "Student nr. " << i << " : "; cout << gruppe[i].vorname << " " << gruppe[i].name << " , "; cout << gruppe[i].matrikel << " , " << gruppe[i].skz << endl; // Let us have a look on equivalent data acesses pg = gruppe+i; cout << endl << " Test" << endl; // Access on string cout << pg->vorname << " " << (*pg).vorname << endl; // Acess on first string character cout << pg->vorname[0] << " " << *pg->vorname << " " << *(*pg).vorname << " " << (*pg).vorname[0] << endl; // Acess on fourth string character cout << pg->vorname[3] << " " << *(pg->vorname+3) << " " << *((*pg).vorname+3) << " " << (*pg).vorname[3] << endl; } delete [] gruppe; // deallocate memory system("PAUSE"); return EXIT_SUCCESS; } Testdaten: 4 Lennon John 6255308 810 McCartney Paul 6255221 406 Harrison George 6155003 860 Starr Ringo 6355985 412 ++++ Die Zugriffe ''(*pg).vorname'' und ''pg%%->%%vorname'' sind völlig äquivalent. Allerdings verbessert letzterer deutlich die Lesbarkeit eines Programmes insbesondere, wenn der Zeiger ein dynamisches Feld des Typs ''Student'' darstellt. Dies zeigt sich insbesondere beim Zugriff auf Feldelemente von ''vorname'' (d.h., einzelne Zeichen). Der Zugriff auf das 0.Zeichen erfolgt mittels pg->vorname[0] oder *pg->vorname oder (*pg).vorname[0] oder *(*pg).vorname und der Zugriff auf das 3.Zeichen mittels pg->vorname[3] oder *(pg->vorname+3) oder (*pg).vorname[3] oder *((*pg).vorname+3) Beachte, dass ''pg%%->%%vorname'' einen Zeiger auf den Typ char darstellt und der Dereferenzierungsoperator * vor der Addition + ausgeführt wird. Vermuten und teste, was bei Verwendung von ''*pg->vorname+3'' herauskommt.