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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren