VERBATIM/b233a: int i, *pi, f[10]; /* Vereinbarung */ pi = &f[0]; /* Adresse des ersten Feldelementes */ pi = f; /* analog: Adresse des Feldes: */ /* f ist Konstantenbezeichner fuer Adresse des Feldanfangs */ pi++; /* ok */ f++; /* falsch! kein Lvalue */ char g[100][200]; /* Definition eines Feldes von Zeichenfeldern */ char *pc; /* Zeiger auf Zeichenfeld */ pc=&g[50][0]; /* Adresse des 1.Zeichens der 51.Zeichenkette */ pc=g[50]; /* entspricht &g[50][0] */Besondere Aufmerksamkeit erfordern Zeigeroperationen mit Nebeneffekt (Vorrang):
i = *(pi + 2); ANALOG: i = f[2]; /* Arithmetik in Feldelementen */ pi + i ANALOG: &f[i] ANALOG: f + i pi[2] = 5; ANALOG: f[2] = 5; /* pi als Feldbezeichner gilt auch */ Diese Zeigeroperationen finden z.B. in den Funktionen zur Zeichenkettenverarbeitung häufig Verwendung:
VERBATIM/b233b: #define N 20 int f[N], *p1, *p2, *p3, *p4, i, x; i=5; p1 = p2 = p3 = p4 = &f[i]; x = *p1++; /* analog: x = f[i++]; */ x = *++p2; /* analog: x = f[++i]; */ x = (*p3)++; /* analog: x = f[i]++; */ x = ++*p4; /* analog: x = ++f[i]; */void strcpy(char *s1, char *s2)
{ while ( *s1++ = *s2++ ) ; }
BEISPIELE/b233a.c: #include <stdio.h> main() /* Beziehung Zeiger - Felder */ { int i, *ip, f[5]; i = 5; while(i--) f[i] = i; i = 3; ip = &f[i]; printf("f : %d\n", f); /* Adresse des Feldanfangs */ printf("ip : %d\n", ip); /* Adresse des 3. Feldelementes */ printf("f+i : %d\n", f+i); /* dto. */ printf("f[i] : %d\n", f[i]); /* Wert des 3. Feldelementes */ printf("*(ip+i): %d\n", *(ip+i)); /* dto. */ /* * und ++ haben gleichen Vorrang => rechter Operator wird zuerst auf Operand angewendet */ i = *ip++; /* i = f[3]; ip++ (&f[4]) */ printf("i = *ip++; i: %d, ip: %d, *ip: %d\n", i, ip, *ip); i = (*ip)--; /* i = f[4]; f[4] -= 1; */ printf("i = (*ip)--; i: %d, ip: %d, *ip: %d\n", i, ip, *ip); }