www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pointer und Adressen Verständnisproblem


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe eine Frage zu Handhabung von Pointern und Adressen.
Es geht darum einem Pointer eine Adresse zu übergeben die als Wert in 
einer Variable gespeichert ist.

Beispiel:

char *a:
long b = 0x0000000F;

Nun möchte ich, das Pointer a auf die Adresse 0x0000000F zeigt, welche 
in der Variable b abgelegt ist.

Wie ist das in C umzusetzen?

Benutze ich den Adressoperator bekomme ich die Adresse von b, nutze ich 
den Sternoperator bekomme ich den Inhalt.

Wie kann ich mein kleines Problem lösen?
Gruß Thomas

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wie kann ich mein kleines Problem lösen?

a = b?

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas schrieb:
> Beispiel:
>
> char *a:
> long b = 0x0000000F;
>
> Nun möchte ich, das Pointer a auf die Adresse 0x0000000F zeigt, welche
> in der Variable b abgelegt ist.

0x0000000F ist der Wert der Variablen, nicht deren Adresse.
Außerdem ist es zwecks Typenprüfung blöd, einen char-zeiger auf ein long 
zeigen zu lassen.

So als Allgemeinbeispiel:
long *zeiger = NULL;  //Nirgends hinzeigen

long variable = 78;   //Wert der Variablen

zeiger = & variable;  //zeiger hat jetzt die Adresse von Variable gespeichert

* zeiger = 45;   // Wert der Variablen ändern

Hoffe ich hab mich nicht vertan :-)

Autor: Mobius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfach, du willst, dass a auf die Adresse im Inhalt von b zeigt. 
Genau das sagst du deinem Compiler. Dann wirst du mit Sicherheit noch 
auf den Datentyp von a typecasten müssen.
char *a;
long b = 0xf;

a = (char*)b; // setzt die Adresse von a auf den Inhalt von b
*a = 0xab;    // greift auf den Inhalt vom Speicher 0xF zu und setzt diesen auf 0xab

gruß
Mobius

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das ist mir soweit auch klar.
Um beim Beispiel zu bleiben.
Der Inhalt der Variable b representiert eine Adresse im Speicherbereich, 
die z.B. über eine Externe Schnittstelle übergeben wurde.

Von außen kommt also eine Anforderung, z.B. lesen ab der Adresse 
0x0000000F für z.B. 20 Byte.

Die Anforderung wird nun interpretiert und in Varaiblen 
zwischengespeichert.

long Adresse = 0x0000000F;
Long Laenge  = 0x00000014;

Hier soll nun ein char Pointer auf diese Adresse zeigen ( die in der 
Varaible Adresse abgelegt ist ) und deren Inhalt z.B. in ein Byte Array 
speichern.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mobius schrieb:
> char *a;
> long b = 0xf;
>
> a = (char*)b; // setzt die Adresse von a auf den Inhalt von b
> *a = 0xab;    // greift auf den Inhalt vom Speicher 0xF zu und setzt diesen auf 
0xab

geht bei dem Cast die Information verloren, wenn die Adresse größer als 
in char ist?

Autor: Maxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein.

Schau dir mal sizeof(a) an

Autor: Mobius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähm, ein char* ist genauso lang wie ein int*, ein long*, ein float*, 
etc. Das sind alles Pointer, und damit IMMER gleich lang (für eine 
bestimmte Architektur) und meist genauso lang wie ein int. Das char bei 
dem sagt nur, wie der Compiler die Daten in der bestimmten Adresse 
interpretieren soll.

Also kann ich dir deine Frage nicht beantworten, so lange ich nicht 
weiß, auf welchem Chip du das verwenden willst. Wenn du beim avr-gcc 
(16bit int = 16bit pointer) versuchst die Adresse 0x1FFFA einzutragen, 
wirst du kläglich scheitern. Auf einem 32bit ARM oder SPARC sieht die 
Geschichte schon anders aus.

Hoffe das ist verständlich, wenn nicht, nachhacken ^_^
gruß
Mobius

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

Autor: tset (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas schrieb:
> Wie kann ich mein kleines Problem lösen?
Am besten selber... ;-)
int *a=NULL;
int b=0xf;

printf("a %d | %p || b %d | %p\n",a,a,b,b);

a=b;
printf("a %d | %p || b %d | %p\n",a,a,b,b);

Was %p ist, ist deine Hausaufgabe... ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.