//Präprozessor Direktive
#include <stdio.h>
#include <stdlib.h>

void WertTausch(int *Wert1);
void CharPointer(char *sz);

void main()
{
    int 	i1 = 2, i2 = 10;
    double 	d1 = 1.12, d2 = 78.65;
    char 	c1 = 'm';
	char	sz1[] = "Ein Array ist bereits ein Zeiger.";

	// Pointervariable in der Regel 2 - 4 Bytes
	// Wert einer Pointervariable ist eine Adresse
	int *pt;

    system("CLS");

	// & = Adressoperator
	printf("\n1. Ausgabe - Variablen Dekl./Ini. :\n-----------------------------------");
    printf("\nwert von i1 = %i\t\t ** Adresse = %u",i1,&i1);
	printf("\nwert von i2 = %i\t ** Adresse = %u",i2,&i2);
	printf("\nwert von d1 = %.2f\t ** Adresse = %u",d1,&d1);
	printf("\nwert von d2 = %.2f\t ** Adresse = %u",d2,&d2);
	printf("\nwert von c1 = %c\t\t ** Adresse = %u",c1,&c1);
	printf("\n\n");

	//Pointervariable hat nun die Adresse von i1	
	pt = &i1;
	// * nimm den Inhalt der Speicherstelle auf den die Adresse zeigt
	// * (indirection operator)
	printf("\n2. Ausgabe - pt = &i1\n---------------------");
	printf("\nwert von i1 = %i\t\t ** Adresse = %u",i1,&i1);
	printf("\nwert von pt = %u\t ** Adresse = %u",pt,&pt);
	printf("\npt zeigt auf den Wert %i",*pt);
	printf("\n\n");

	// *ptr und i1 sind beziehen sich also auf den gleichen Wert
	*pt = 60;
	printf("\n3. Ausgabe - *pt = 60\n---------------------");
	printf("\nwert von i1 = %i\t ** Adresse = %u",i1,&i1);
	printf("\nwert von pt = %u\t ** Adresse = %u",pt,&pt);
	printf("\npt zeigt auf den Wert %i",*pt);
	printf("\n\n");	

	// Ohne Adressoperator CALL BY VALUE, mit CALL BY REFERENCE
	WertTausch(&i1);
	printf("\nmain() Wert von i1 = %i",i1);
	printf("\n\n");

	// Pointer-Arithmetik
	// pointer immer gleiche Anzahl an Bytes
	// der Typ legt fest umwieviele Bytes die Adresse runtergezählt wird
	// bei INT 4 Bytes ...zeigt auf die Adresse von i1 -- dann auf i2
	printf("\nwert von pt = %u",*pt);
	pt--;
	printf("\nwert von pt = %u",*pt);

	//POinterbesonderheitbei char[] - ein Array ist bereits ein Pointer auf
	// das erste Element. 
	printf("\n");
	CharPointer(sz1);
	printf("\n");


}


void WertTausch(int *Wert1)
{
	int lcVar = 99;

	printf("\nWertTausch orig. lcVar Wert = %i",lcVar);
	
	lcVar = *Wert1;

	printf("\nWertTausch lcVar = *Wert1 => %i",lcVar);

	lcVar += 9;

	printf("\nWertTausch lcVar + 9 => %i",lcVar);

	*Wert1 = lcVar;

	printf("\nWertTausch *Wert1 = lcVar => %i",lcVar);	
}

void CharPointer(char *sz)
{
	printf("\nAusgabe in CharPointer():");
	printf("\n");
	while(*sz)
		putchar(*sz++); // char = 1 Byte, Pointer wird um 1 Byte erhöht

}


