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
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 :-)
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
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.
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?
Ä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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.