Seite 1 von 2

Zeiger und mehrdimensionale Arrays

Verfasst: Di Nov 09, 2010 3:38 pm
von tauberheli
Hi!

Wenn man ein eindimensionales Array hat, z.B.

feld[10]

, kann man ja mit einem Zeiger auf ein bestimmtes Feld springen, z.B.

*(feld + i)


Wie würde der Zeiger bei einem mehrdimensionalen Array aussehen?

LG

Re: Zeiger und mehrdimensionale Arrays

Verfasst: Di Nov 09, 2010 3:52 pm
von Dirty Oerti
Tag :)

feld[a] ist im Prinzip das Gleiche wie feld[a*b]

Um also z.B. zu feld[3][5] zu kommen musst du feld[3*b + 5] gehen.
Daraus kannst du dir auch deinen Zeiger ableiten.

:) Löst das dein Problem?

Nachtrag:
Ich bin mir gerade nicht sicher, ob es nicht feld[5*a + 3] ist.

Re: Zeiger und mehrdimensionale Arrays

Verfasst: Di Nov 09, 2010 5:07 pm
von AnGaiNoR
Warum benutz du nicht einfach den Indizierungsoperator? Dafür ist er ja da.

Re: Zeiger und mehrdimensionale Arrays

Verfasst: Di Nov 09, 2010 5:38 pm
von Dirty Oerti
Ganz einfach:
Wenn man nicht den Indizierungsoperator verwendet, dann ist man gezwungen, sich zu überlegen, wie mehrdimensionale Arrays im Speicher aussehen.
Sonst kann man ja nicht darauf zugreifen.
Außerdem könnte man so ein mehrdimensionales Array besser komplett durchlaufen (eine for schleife mit Zeigererhöhung anstatt 2 mit Indizes)

Re: Zeiger und mehrdimensionale Arrays

Verfasst: Di Nov 09, 2010 7:46 pm
von Xin
Dirty Oerti hat geschrieben:Tag :)

feld[a] ist im Prinzip das Gleiche wie feld[a*b]

Um also z.B. zu feld[3][5] zu kommen musst du feld[3*b + 5] gehen.
Daraus kannst du dir auch deinen Zeiger ableiten.

:) Löst das dein Problem?

Nachtrag:
Ich bin mir gerade nicht sicher, ob es nicht feld[5*a + 3] ist.

Ich bin mir hingegen sicher, dass feld[3][5] was anderes ist als feld[3*5].
Ein char feld[3*5] ist ein char feld[15] und damit ein char * auf 15 Bytes.
Ein char feld[3][5] ist aber ein char * feld[3] oder ein char ** feld auf 12 Bytes (3 Pointer)

Heißt, ein char feld[3][5] muss erstmal mit 3 Pointern auf char [5] belegt werden oder es gibt Segmentation Faults ^^

Re: Zeiger und mehrdimensionale Arrays

Verfasst: Di Nov 09, 2010 9:47 pm
von Dirty Oerti
Xin hat geschrieben:Ich bin mir hingegen sicher, dass feld[3][5] was anderes ist als feld[3*5].
Ein char feld[3*5] ist ein char feld[15] und damit ein char * auf 15 Bytes.
Ein char feld[3][5] ist aber ein char * feld[3] oder ein char ** feld auf 12 Bytes (3 Pointer)

Heißt, ein char feld[3][5] muss erstmal mit 3 Pointern auf char [5] belegt werden oder es gibt Segmentation Faults ^^
Hm, dann erklär mir mit dieser Logik bitte folgendes Verhalten:

Code: Alles auswählen

#include <stdlib.h>
#include <stdio.h>



int main(int argc, char**argv)
{
  char feld[3][4];
  char *zeiger;
  unsigned char i = 0;
  unsigned char j = 0;
  for(; i < 3; i++)
  {
    for(j=0; j < 4; j++)
    {
      feld[i][j] = (i+1)*10 + (j+1);
    }
  }
  printf("Feldinhalt, Ausgabe durch 1 (!) Zeiger:\n{ ");
  for(i=0; i < (3*4); i++)
  {
    zeiger = (char*)feld;
    zeiger = zeiger + i;
    int inhalt = (int)*zeiger;
    printf(" %i  ",inhalt);
  }
  printf("}\n");

  printf("Feldinhalt, Ausgabe durch 2 Indizes:\n{ ");  
  for(i=0; i < 3; i++)
  {
    for(j=0; j < 4; j++)
    {
      int inhalt = feld[i][j];
      printf(" %i  ",inhalt);
    }
  }
  printf("}\n\n");
  printf("Adresse von Zeiger: %lo \n",(unsigned long)zeiger);
  return 0;
}
Ausgabe hat geschrieben:daniel@gosigmus:~/Desktop/mehrdimensionaleFelder$ ./multiFeld
Feldinhalt, Ausgabe durch 1 (!) Zeiger:
{ 11 12 13 14 21 22 23 24 31 32 33 34 }
Feldinhalt, Ausgabe durch 2 Indizes:
{ 11 12 13 14 21 22 23 24 31 32 33 34 }

Adresse von Zeiger: 3777744507621633

Das legt zumindest nahe, dass ein mehrdimensionales Feld im Speicher "flach" dargestellt wird.
Sonst könnte ich das Feld kaum durch einen Zeiger auslesen, der einfach nur linear durch den Speicher wandert...

Re: Zeiger und mehrdimensionale Arrays

Verfasst: Di Nov 09, 2010 10:02 pm
von AnGaiNoR
Xin hat geschrieben: Ein char feld[3][5] ist aber ein char * feld[3] oder ein char ** feld auf 12 Bytes (3 Pointer)
Wenn das so ist, warum ist das Folgende dann eine falsche Aussage?

Code: Alles auswählen

sizeof( char[3][5] ) == sizeof( char*[3] )

Re: Zeiger und mehrdimensionale Arrays

Verfasst: Di Nov 09, 2010 10:15 pm
von Xin
AnGaiNoR hat geschrieben:
Xin hat geschrieben: Ein char feld[3][5] ist aber ein char * feld[3] oder ein char ** feld auf 12 Bytes (3 Pointer)
Wenn das so ist, warum ist das Folgende dann eine falsche Aussage?

Code: Alles auswählen

sizeof( char[3][5] ) == sizeof( char*[3] )
Vermutlich, weil ich mir sehr sicher war, das ungeprüft geschrieben habe und mich dann geirrt habe. ^^

Ich habe es jetzt noch nicht geprüft und bin etwas verwundert, denn der Zugriff über x*5+y ist eigentlich eher... lahm!?

Re: Zeiger und mehrdimensionale Arrays

Verfasst: Di Nov 09, 2010 10:16 pm
von AnGaiNoR
Was meinst du denn mit "lahm"?

Re: Zeiger und mehrdimensionale Arrays

Verfasst: Di Nov 09, 2010 10:19 pm
von Xin
AnGaiNoR hat geschrieben:Was meinst du denn mit "lahm"?
Naja, es findet eine Multiplikation statt, die gerade bei alten CPUs sehr teuer war.