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


von Thomas (Gast)


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

von holger (Gast)


Lesenswert?

>Wie kann ich mein kleines Problem lösen?

a = b?

von Floh (Gast)


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 :-)

von Mobius (Gast)


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

von Thomas (Gast)


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.

von Thomas (Gast)


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?

von Maxx (Gast)


Lesenswert?

Nein.

Schau dir mal sizeof(a) an

von Mobius (Gast)


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

von Thomas (Gast)


Lesenswert?

Danke!

von tset (Gast)


Lesenswert?

Thomas schrieb:
> Wie kann ich mein kleines Problem lösen?
Am besten selber... ;-)
1
int *a=NULL;
2
int b=0xf;
3
4
printf("a %d | %p || b %d | %p\n",a,a,b,b);
5
6
a=b;
7
printf("a %d | %p || b %d | %p\n",a,a,b,b);

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.