Forum: Compiler & IDEs Pointer auf Variablenadressen


von ben.pu (Gast)


Lesenswert?

Hallo,
wollte mal fragen ob jeman weiß wie ich das Problem lösen kann:
1
char *i = &a;
2
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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Karl H. (kbuchegg)


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.
1
struct menu {
2
  ...
3
  struct menu * prev;
4
  struct menu * next;
5
};
6
7
// das sind erst mal nur Deklarationen. Ihr Zweck ist es, dass
8
// der Compiler erst mal weiß dass es 2 Variablen namens Punkt1
9
// u. Punkt2 gibt
10
extern struct menu Punkt1;
11
extern struct menu Punkt2;
12
13
// und jetzt die eigentlichen Variablen. Da Punkt1 und Punkt2 prinzipiell
14
// ja schon bekannt sind, kann man sich auch auf sie beziehen
15
struct menu Punkt1 = { ..., NULL, &Punkt2 };
16
struct menu Punkt2 = { ..., &Punkt1, NULL };
17
18
....

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.