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.cpp
// Dynamic array of type student
#include <iostream>
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:
- input.txt
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.