Zeiger und mehrdimensionale Arrays

Schnelle objektorientierte, kompilierende Programmiersprache.
tauberheli
Beiträge: 16
Registriert: Di Apr 27, 2010 3:47 pm

Zeiger und mehrdimensionale Arrays

Beitrag von tauberheli » Di Nov 09, 2010 3:38 pm

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

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Zeiger und mehrdimensionale Arrays

Beitrag von Dirty Oerti » Di Nov 09, 2010 3:52 pm

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.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

AnGaiNoR
Beiträge: 212
Registriert: Sa Jul 19, 2008 7:07 pm
Wohnort: Dresden

Re: Zeiger und mehrdimensionale Arrays

Beitrag von AnGaiNoR » Di Nov 09, 2010 5:07 pm

Warum benutz du nicht einfach den Indizierungsoperator? Dafür ist er ja da.
Physics is like sex: sure, it may give some practical result, but that's not why we do it.
(Richard P. Feynman)

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Zeiger und mehrdimensionale Arrays

Beitrag von Dirty Oerti » Di Nov 09, 2010 5:38 pm

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)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Zeiger und mehrdimensionale Arrays

Beitrag von Xin » Di Nov 09, 2010 7:46 pm

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 ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Zeiger und mehrdimensionale Arrays

Beitrag von Dirty Oerti » Di Nov 09, 2010 9:47 pm

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...
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

AnGaiNoR
Beiträge: 212
Registriert: Sa Jul 19, 2008 7:07 pm
Wohnort: Dresden

Re: Zeiger und mehrdimensionale Arrays

Beitrag von AnGaiNoR » Di Nov 09, 2010 10:02 pm

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] )
Physics is like sex: sure, it may give some practical result, but that's not why we do it.
(Richard P. Feynman)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Zeiger und mehrdimensionale Arrays

Beitrag von Xin » Di Nov 09, 2010 10:15 pm

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!?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

AnGaiNoR
Beiträge: 212
Registriert: Sa Jul 19, 2008 7:07 pm
Wohnort: Dresden

Re: Zeiger und mehrdimensionale Arrays

Beitrag von AnGaiNoR » Di Nov 09, 2010 10:16 pm

Was meinst du denn mit "lahm"?
Physics is like sex: sure, it may give some practical result, but that's not why we do it.
(Richard P. Feynman)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Zeiger und mehrdimensionale Arrays

Beitrag von Xin » Di Nov 09, 2010 10:19 pm

AnGaiNoR hat geschrieben:Was meinst du denn mit "lahm"?
Naja, es findet eine Multiplikation statt, die gerade bei alten CPUs sehr teuer war.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten