Einzelnen Beitrag anzeigen
Alt 31.05.2002, 07:49   #3
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Zeiger sind Variablen. Ganz spezielle Variablen. In ihnen werden keine Datenwerte sondern Speicheradressen hinterlegt. Um an die Datenwerte an diesen bzw. dieser Speicheradresse(n) heranzukommen muß man den * Operator unmittelbar vor dem Variablennamen des Zeigers angeben. Resultieren tut das ganze dann in dem Datentyp, auf den der Zeiger zeigt und so definiert wurde. Die Definition erfolgt ebenso mit Datentyp *zeiger;

Deklaration:

int datenvariable,*zeigervariable;

Definition:

int funktion (int datenparameter, int *zeigerparameter)


Typdefinition:

typedef <bekannter Datentyp/Strukturdefinition> * zeigertyp,datentyp;

z.B.: typedef char * zeiger_auf_char;

und in weiterer Folge bei der Deklaration: zeiger_auf_char pChar;

pChar ist eine Zeigervariable vom Typ char *

Um den Datenwert der Speicheradresse bzw. des Speicherbereichs zu erhalten / zu setzen, auf den die Zeigervariable weist, muß man mittles * zeiger zugreifen.

int ch,*pChar;

pChar= &ch;

& (=Ampersand) ist der Adreßoperator. Die Datenvariable ch wird an einer Speicherstelle vorgehalten. Die Adresse dieser Speicherstelle ermittelt man mit dem "Address of" - Operator &.

*pChar= 'a'; /* pChar muß auf ch zeigen ! */

printf("Zeichen in ch: %c\n",ch);

Arithmetik:

typedef struct {
int var1,var2;
long var3,var4;
} typstrukt1;

typstrukt1 strukt_MAXI[2],*zeiger_auf_strukt_MAXI_vom_typ_typstrukt1;

zeiger_auf_strukt_MAXI_vom_typ_typstrukt1= &strukt_MAXI[0];

for(i=0;i<2;i++,zeiger_auf_strukt_MAXI_vom_typ_typ strukt1++)
{
zeiger_auf_strukt_MAXI_vom_typ_typstrukt1->var1=1;
zeiger_auf_strukt_MAXI_vom_typ_typstrukt1->var2=2;
zeiger_auf_strukt_MAXI_vom_typ_typstrukt1->var3=3;
zeiger_auf_strukt_MAXI_vom_typ_typstrukt1->var4=4;
}


Erklärung zur Arithmetik:

" zeiger_auf_strukt_MAXI_vom_typ_typstrukt1++ " bedeutet den Inhalt der Zeigervariablen um die Größe des Datentyps, auf den die Zeigervariable weist, zu erhöhen.

Wenn man die Länge des Datentyps typstrukt1 mit 12 Bytes annimmt (je 2 Bytes für var1 und var2 sowie 4 Bytes für var3 und var4) so erhöht sich der Wert (=die Speicheradresse) in zeiger_auf_strukt_MAXI_vom_typ_typstrukt1 nicht um 1 sondern um 12.

Wenn man zeiger_auf_strukt_MAXI_vom_typ_typstrukt1+=2; schreibt, so erhöht sich der Wert in zeiger_auf_strukt_MAXI_vom_typ_typstrukt1 nicht um 2 sondern um 2*12 = 24.

Arrays versus Zeiger:

Arrays sind feste Zeiger, die keine L-Werte (Linksseitige Zuweisungswerte) annehmen können.

int array_von_ints[100]; /* Index geht von 0 bis 99 !!! */

int intvariable;

int *zeiger_auf_arrayelement,*zeiger_auf_arrayelement_ nein_einzelnen_intwert;

zeiger_auf_arrayelement= array_von_ints;
zeiger_auf_arrayelement_nein_einzelnen_intwert= &intvariable;

Im zweiten Fall braucht man das Ampersand (-> & <-), im ersten nicht, weil array_von_ints bereits ein (fester) Zeiger - und damit keine Datenvariable - ist.

mfg
Kikakater
kikakater ist offline   Mit Zitat antworten