Zeiger und mehrdimensionale Arrays
-
- Beiträge: 16
- Registriert: Di Apr 27, 2010 3:47 pm
Zeiger und mehrdimensionale Arrays
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
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
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: Zeiger und mehrdimensionale Arrays
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.

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.

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.
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.
Re: Zeiger und mehrdimensionale Arrays
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)
(Richard P. Feynman)
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: Zeiger und mehrdimensionale Arrays
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)
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.
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.
- 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
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: Zeiger und mehrdimensionale Arrays
Hm, dann erklär mir mit dieser Logik bitte folgendes Verhalten: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 ^^
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.
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.
Re: Zeiger und mehrdimensionale Arrays
Wenn das so ist, warum ist das Folgende dann eine falsche Aussage?Xin hat geschrieben: Ein char feld[3][5] ist aber ein char * feld[3] oder ein char ** feld auf 12 Bytes (3 Pointer)
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)
(Richard P. Feynman)
- 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
Vermutlich, weil ich mir sehr sicher war, das ungeprüft geschrieben habe und mich dann geirrt habe. ^^AnGaiNoR hat geschrieben:Wenn das so ist, warum ist das Folgende dann eine falsche Aussage?Xin hat geschrieben: Ein char feld[3][5] ist aber ein char * feld[3] oder ein char ** feld auf 12 Bytes (3 Pointer)Code: Alles auswählen
sizeof( char[3][5] ) == sizeof( char*[3] )
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Zeiger und mehrdimensionale Arrays
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)
(Richard P. Feynman)
- 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
Naja, es findet eine Multiplikation statt, die gerade bei alten CPUs sehr teuer war.AnGaiNoR hat geschrieben:Was meinst du denn mit "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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.