www.mikrocontroller.net

Forum: Compiler & IDEs Pointer auf Variablenadressen


Autor: ben.pu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
wollte mal fragen ob jeman weiß wie ich das Problem lösen kann:

char *i = &a;
char *a = &i;


Es mag zwar doof aussehen aber es hat schon seinen sinn :-)
Grund für dieses Konstrukt ist, dass ich für eine graphische Oberfläche 
Menüstriktogramme erstellt haben die jeweils die Adresse des vorherigen 
und des nachfolgenden Menüstruktogrammens enthalten sollen.

Grüße, Benny.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht nicht, weil es syntaktisch falsch ist.

   char *i = &a;

Das ist ein Pointer auf char, der auf die Adresse von a zeigt.
Bei a handelt es sich also um einen char.

  char *a = &i;

Das ist ein Pointer auf char, der auf die Adresse von i zeigt.

Bei diesem i handelt es sich um einen char, was sich mit der ersten 
Definition von i (Pointer auf char) reibt.
Und dieses a ist ebenso als Pointer auf char definiert und nicht, wie 
oben gefordert, als char.


Vermutlich willst Du aber etwas ganz anderes erreichen, nämlich eine 
Struktur, die Pointer auf andere Strukturen gleichen Typs enthält.

  struct bla
  {
    struct bla * p;
  };

  extern struct bla b;

  struct bla a = { &b };

  struct bla b = { &a };

Der Trick besteht hier in der mit "extern" gebauten Vorwärtsdeklaration, 
bei der dem Compiler mitgeteilt wird, daß es ein Objekt b gibt, so daß 
bei der Initialisierung von a dessen Adresse verwendet werden kann, ohne 
daß das Objekt b bereits initialisiert ist.
Das Objekt b wird danach definiert und mit der Adresse von a 
initialisiert.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ben.pu schrieb:

> Es mag zwar doof aussehen

Dein Beispiel?

> aber es hat schon seinen sinn :-)

Nö, das ist sinnlos. Sieh dir einfach mal die Datentypen an. Das kann 
nicht gehen.

> Grund für dieses Konstrukt ist, dass ich für eine graphische Oberfläche
> Menüstriktogramme erstellt haben die jeweils die Adresse des vorherigen
> und des nachfolgenden Menüstruktogrammens enthalten sollen.

Das ist aber was anderes.
Machs nicht über Initialisierungen, sondern als normale Zuweisungen.
Je nachdem wie dein Code konkret aussieht, kann man auch was mit 
Deklaration / Definition machen.

struct menu {
  ...
  struct menu * prev;
  struct menu * next;
};

// das sind erst mal nur Deklarationen. Ihr Zweck ist es, dass
// der Compiler erst mal weiß dass es 2 Variablen namens Punkt1
// u. Punkt2 gibt
extern struct menu Punkt1;
extern struct menu Punkt2;

// und jetzt die eigentlichen Variablen. Da Punkt1 und Punkt2 prinzipiell
// ja schon bekannt sind, kann man sich auch auf sie beziehen
struct menu Punkt1 = { ..., NULL, &Punkt2 };
struct menu Punkt2 = { ..., &Punkt1, NULL };

....

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.