Pointer und Adressen Verständnisproblem

Gast #1905044
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
Gast #1905057
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:
1
long *zeiger = NULL;  //Nirgends hinzeigen
2

3
long variable = 78;   //Wert der Variablen
4

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

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

Hoffe ich hab mich nicht vertan :-)
Gast #1905059
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.
1
char *a;
2
long b = 0xf;
3

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

gruß
Mobius
Gast #1905067
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.
Gast #1905070
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?
Gast #1905089
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.