Navigation

2.3.3 Beziehung zwischen Zeigern und Feldern

In C orientieren sich Zeiger an Feldern:

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] */

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 */

Besondere Aufmerksamkeit erfordern Zeigeroperationen mit Nebeneffekt (Vorrang):

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]; */

Diese Zeigeroperationen finden z.B. in den Funktionen zur Zeichenkettenverarbeitung häufig Verwendung:
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);
}

Navigation