Zeiger- Beispiel

Angabe / Beschreibung

Dieses Programm demonstriert die Anwendung von Zeigern. Weiters werden auch wieder Variablen per Wert, Referenz und Zeiger an Funktionen übergeben.

Lösung

/* Beispiel: Zeiger 
   Filename:main.cpp
   Author:Lahmer
   Title:Verdeutlichung von Zeiger
   Description: Anhand dieses Beispiels werden Zeiger näher erläutert
   Last Change:16.01.2018
*/
 
 
//Hedader-Dateien bzw. Bibliotheken
#include <iostream>
#include <conio.h>
 
//Namespace
using namespace std;
 
 
//Funktionsprototyp 
int diff(int a, int b); //Parameterübergabe per Wert => Rückgabewert int, 2 int-Übergabeparameter
void erhoehezahl(int &a); //Parameterübergabe per Referenz => Rückgabewert void (nichts), Variable i wird als Referenz übergeben
void verringerezahl(int *b); //Parameterübergabe per Zeiger => Rückgabewert void (nichts), Variable b wird als Zeiger übergeben
 
 
//Hauptprogramm
int main(int argc, char** argv) {
 
	//Lokale Variablendeklaration
	int z1=99,z2=23;
	int erg=0;
	int *ptr;
	int *ptr2;	//ptr2,ptr soll auf z2 zeigen: ptr2, ptr --> z2;
	int *ptr3;	//ptrx soll auf z1 zeigen: ptrx --> z1
 
 
	//Ausgabe der Speicheradressen der angelegten Variablen
	cout << "Adresse der Variable z1: " << &z1 << endl;
	cout << "Adresse der Variable z2: " << &z2 << endl;
	cout << "Adresse der Variable erg: " << &erg << endl;
	cout << "Adresse der Variable ptr: " << &ptr << endl;
	cout << "Adresse der Variable ptr2: " << &ptr2 << endl;
	cout << "Adresse der Variable ptr3: " << &ptr3 << endl;
	cout << endl << endl;
 
 
	//Die Adresse von der Variable z2 wird in die Variable ptr gespeichert
	ptr=&z2;
 
	//Der Inhalt von ptr (also die Adresse von z2) wird in die Variable ptr2 gespeichert
	ptr2=ptr;
 
	//Die Adresse von z1 wird in die Variable ptr3 gespeichert
	ptr3=&z1;
 
 
	cout << "Pointer1: " << endl;		
	cout << &ptr << endl;	//Ausgabe der Adresse der Variable ptr
	cout << ptr << endl;	//Ausgabe des Inhalts von ptr (also die Adresse von z2)
	cout << *ptr << endl;	//Ausgabe des Inhalts von der in ptr gespeicherten Adresse (also der Inhalt von z2)
 
	cout << "Pointer2: " << endl;
	cout << &ptr2 << endl;	//Ausgabe der Adresse der Variable ptr2 (also die Adresse von ptr2)
	cout << ptr2 << endl;	//Ausgabe der Variable ptr2 (also die Adresse von z2)
	cout << *ptr2 << endl << endl;	//Ausgabe des Inhalts an der gespeicherten Adresse in ptr2 (also der Inhalt von z2)
 
	cout << "Pointer3: " << endl;
	cout << &ptr3 << endl;	//Ausgabe der Adresse der Variable ptr3
	cout << ptr3 << endl;	//Ausgabe der Variable ptr3 (also die Adresse von z1)
	cout << *ptr3 << endl << endl; 	//Ausgabe des Inhalts an der gespeicherten Adresse in ptr3 (also der Inhalt von z1)
 
 
	cout << "#######################" << endl;
 
 
	//Funktionsaufrufe
	//Die Variablen z1 und z2 werden per Wert übergeben (=Kopie im Speicher)
	erg=diff(z1,z2);
	cout << erg << endl;
 
	//Die Variable z1 wird per Referenz übergeben, d.h. eine neue zweite Variable in der Funktion erhoehezahl() zeigt auf denselben Speicherplatz von z1
	erhoehezahl(z1);
	cout << z1 << endl;
 
	//Die Variable z2 wird per Zeiger übergeben, d.h. die Adresse von z2 wird an die Funktion verringerezahl() übergeben, die Variable b in der Funktion enthält dann die Adresse von z2
	verringerezahl(&z2);
	cout << z2 << endl;
 
	*ptr = *ptr*10;  //Der Inhalt an der gespeicherten Adresse in ptr (also z2) wird mit 10 multipliziert und an den Inhalt der in ptr gespeicherten Adresse (also z2) geschrieben 
	*ptr3 = *ptr2;   //Der Inhalt an der gespeicherten Adresse in ptr2 (also z2) wird über den Inhalt an der gespeicherten Adresse in ptr3 geschrieben
 
	cout << endl << endl;
	cout << "Inhalt der Variable z1: " << z1 << endl;
	cout << "Inhalt der Variable z2: " << z2 << endl;
 
 
	//Rückgabewert = 0
	return 0;
}
 
//Funktionsdefinition
int diff(int a, int b) 
{
	//Rückgabe der Differenz a-b
	return a-b;
}
 
 
void erhoehezahl(int &a)
{
	//Die Variable a wird um 1 erhöht, Aufgrund der Übergabe der Referenz wird auch gleichzeitig die Variable z1 im Hauptprogramm erhöht
	a++;
}
 
void verringerezahl(int *b)
{
	//Der Inhalt der in der Variable b gespeicherten Adresse wird um 1 verringert (d.h. z2 wird verringert)
	--*b;
	//Der Inhalt der in der Variable b gespeicherten Adresse wird um 1 verringert (d.h. z2 wird verringert)
	(*b)--;
	//Der Inhalt der in der Variable b gespeicherten Adresse wird um 1 verringert (d.h. z2 wird verringert)
	*b-=1;
}

Beispielhafter Auszug des Speichers

VariableAdresseInhalt
z10x9ffe3c99 → 100 → 200
z20x9ffe3823 → 22 → 21 → 20 → 200
erg0x9ffe340 → 76
ptr0x9ffe280x9ffe38
ptr20x9ffe200x9ffe38
ptr30x9ffe180x9ffe3c

Ausgabe des Programms

Adresse der Variable z1: 0x9ffe3c
Adresse der Variable z2: 0x9ffe38
Adresse der Variable erg: 0x9ffe34
Adresse der Variable ptr: 0x9ffe28
Adresse der Variable ptr2: 0x9ffe20
Adresse der Variable ptr3: 0x9ffe18


Pointer1:
0x9ffe28
0x9ffe38
23
Pointer2:
0x9ffe20
0x9ffe38
23

Pointer3:
0x9ffe18
0x9ffe3c
99

#######################
76
100
20


Inhalt der Variable z1: 200
Inhalt der Variable z2: 200

--------------------------------
Process exited after 0.07103 seconds with return value 0
Drücken Sie eine beliebige Taste . . .