Call-By-Reference mit Zeiger?

Hallo, ich habe gerade ein Brett vorm Kopf.

Call By Reference geht so:

int main()
{
int a;
zahl(a);
printf("%d",a);
}

void zahl(int &a)
{
a=5;
}

Wie geht das nun mit Zeigern?

int main()
{
int *a;
zahl(a);
printf("%d",*a);
}

void zahl(int &*a)

Hallo,

Wie geht das nun mit Zeigern?

int main()
{
int *a;
zahl(a);
printf("%d",*a);
}

void zahl(int &*a)

void zahl(int *a) {
*a = 5;
}

int main() {
int a = 2;
zahl(&a); /* uebergebe die Speicheradresse der Variable a */
printf("%d\n",a);
}

In der Funktion wähle ich als
einen Knoten des Baumes auf, auf dem ich dann arebite.

Irgendwie verstehe ich diesen Satz nicht - koenntest die ihn nochmal anders formulieren?

Gruesse,
Moritz

Hallo. Vielen Dank für die Antwort und sorry, für die Tastaturüberschläge.

Also. Ich hab einen „Baum“, der hat Elemente
class BaumElement;

Jedes Elemente hat Zeiger auf andere Baumelemente, ähnlich einer verketteten Liste, nur halt „in mehr Dimensionen“.

Plan ist nun der: Ich baue eine Funktion, die den ganzen „Baum“ absucht, und ein Element findet (oder halt nicht, dann gibt NULL).

Ganz klassisch:

BaumElement* e = findeElement();

Mit

BaumElement *findeElement(void)
{
return Wurzel->next;
}
findeElement kennt den „Wurzelknoten“, begibt sich auf die suche und liefert die Adresse des BaumElementes, das nach Kriterien gesucht wurde, oder eben NULL, wenn das nicht existiert.

Jetzt muss das aber so aussehen (weil ich z.B. zwei Elemente suche):
BaumElement *e, *f;
findeElement(e,f);
d.h. Nach dem Aufruf der Funktion muss e und f ein Zeiger auf das Baumelement sein.

Hoffe das ist verständlicher.

Hallo.

Jetzt muss das aber so aussehen (weil ich z.B. zwei Elemente
suche):
BaumElement *e, *f;
findeElement(e,f);
d.h. Nach dem Aufruf der Funktion muss e und f ein Zeiger auf
das Baumelement sein.

Warum nicht:

 BaumElement \*e = findeElement(data\_e);
 BaumElement \*f = findeElement(data\_f);

Grüße

CMБ

Das ist nur ein drastisch vereinfachtes Modell. Insbesondere liefert die Suche z.B. zwei Ergebnisse, die nicht unabhängig sind.

Leider ist die Lösung nicht so leicht :frowning:

Howdy,

also generell sollte man 'nen typedef fuer den Typ haben, also

typedef int element\_t;
typedef element\_t\* element\_ptr\_t;

Dann kannst du auch - ohne gross zu ueberlegen, ob der * oder das & zuerst kommt - schreiben:

void zahl(
 element\_ptr\_t& p1,
 element\_ptr\_t& p2)
{
 p1 = ...;
 p2 = ...;
}

Gruss
norsemanna

Hallo

Das ist nur ein drastisch vereinfachtes Modell. Insbesondere
liefert die Suche z.B. zwei Ergebnisse, die nicht unabhängig
sind.
Leider ist die Lösung nicht so leicht :frowning:

Wie lautet denn das Problem? Was willst Du
konkret machen? Wie sehen Daten, die in
den Baum eingetragen werden, aus?

Grüße

CMБ

Das ist so schnell nicht zu erklären.
Die Frage beziehe sich dann auf den Theoretischen Punkt.

Ist eine solche Rückgabe nicht möglich?

Hallo

Das ist so schnell nicht zu erklären.
Die Frage beziehe sich dann auf den Theoretischen Punkt.

OK

Ist eine solche Rückgabe nicht möglich?

Doch, aber das sieht nach einem Problem in
der Herangehensweise aus. Denn in der
Funktion, die die beiden Zeiger belegt
und „zurückgibt“, mußt Du ja auch die
Suche irgendwie erst machen - getrennt.

 bool findeElemente(BaumElement\*\*e, BaumElement\*\*f)
{
 \*e = findeElement(1);
 \*f = findeElement(2);
 return \*e && \*f;
}
 ...

 ...
 BaumElement \*e=0, \*f=0;
 findeElemente(&e, &f);
 ...
}
 ...

Grüße

CMБ

also generell sollte man 'nen typedef fuer den Typ haben, also

typedef int element_t;
typedef element_t* element_ptr_t;

Ja pfui. Wofür „sollte“ man den haben?

Nichts gegen typedefs bei elendig langen Typverschachtelungen, aber element_ptr_t ist nicht gerade schöner als element_t*…

Grüße,
Sebastian

Genau das habe ich gesucht. Mir fehlte der Trick mit dem **

Damit ist es klar. Wie gesagt der Code ist nicht so leicht zu erklären.

Diese Zeigerrückgabe funktioniert bestens.

Vielen Dank