Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

TigerClaw25

unregistriert

1

23.03.2013, 10:37

Unterschied Funktionszeiger und einfache Zeiger

Hallo,

hätte eine Frage zu den Zeigern.

Wenn ich über Zeiger Werte veröndern möchte, dann geschieht dies so:

int a = 10;
int *pZeiger = NULL;
pZeiger = &a;
pZeiger = 50;

Wieso geschieht bei Funktionszeigern die Zuweisung der Speicheradresse einer Funktion ohne den "&"-Operator?
Bei Variablen verwendet man doch auch &a und nicht a.

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

2

23.03.2013, 10:56

Weil für Funktionen Wertzuweisung keinen Sinn macht/nicht möglich ist. Du kannst aber den &-Operator trotzdem auch bei Funktionen verwenden, manchmal, wenn Templates im Spiel sind, ist das sogar nötig.

TigerClaw25

unregistriert

3

23.03.2013, 11:03

hmm, ok, aber mein Rückgabewert in der beispielfunktion ist ein einfacher int-Wert. Und der hat auch eine Adresse. Aber ok, ich nehme das einfach so hin und versuche mich damit zu arrangiere :)

4

23.03.2013, 11:47

Hallo!

Wie Oberon schon geschrieben hat, können Funktionen implizit zu Pointern auf sich selbst konvertiert werden, deswegen ist der Adressoperator vor dem Bezeichner optional.

Sogar das hier klappt:

int (*funcptr)() = *****func;

Diese Zeile funktioniert, weil die Funktion nach jeder Dereferenzierung wieder in einen Pointer auf sich selbst konvertiert wird. Ist aber nur was für Fünf-Sterne-Programmierer ... ;)

So ähnlich ist es auch bei Arrays: Wenn du einen array int a[3] hast, dann kann a implizit zu einem int* konvertiert werden.

Zitat von »TigerClaw25«

aber mein Rückgabewert in der beispielfunktion ist ein einfacher int-Wert. Und der hat auch eine Adresse.

Nein, dieser Rückgabewert hat keine Adresse, weil es sich um einen rvalue handelt. Nur lvalues haben Adressen. Kannst ja mal etwas googlen oder hier noch mal nachfragen, falls du mehr darüber erfahren möchtest.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

23.03.2013, 11:56

hmm, ok, aber mein Rückgabewert in der beispielfunktion ist ein einfacher int-Wert. Und der hat auch eine Adresse. Aber ok, ich nehme das einfach so hin und versuche mich damit zu arrangiere :)

Das erläutere mal bitte genauer.

1)

Quellcode

1
2
3
4
5
int* foo()
{
   int a = 4;
   return &a;
}


2)

Quellcode

1
2
int foo(){...}
int a = &foo();


Meinst Du, dass "a" eine Adresse hat und dass diese zurückgegeben werden kann wie bei (1) oder dass der Rückgabewert von foo() wie in (2) eine Adresse hat? Letzteres wäre falsch, denn foo() liefert einen r-value, keinen l-value.
Das Beispiel (1) ist allerdings ebenfalls ganz übel, weil "&a" nach dem Return auf Stack zeigt, der einem nicht mehr gehört. Im besten Fall passiert gar nichts, im schlimmsten Fall bekommt man ganz üble Laufzeitfehler.

Daher verstehe ich gerade nicht, was Du meinst und eine Erklärung Deinerseits wäre nett.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

6

23.03.2013, 14:59

Nein, ich glaube er meint das hier:

C-/C++-Quelltext

1
2
int foo(){ return 7; }
int a= foo();

Das a hat eine Adresse, der Rueckgabewert sieben hat keine Adresse.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

23.03.2013, 15:04

Das Beispiel (1) ist allerdings ebenfalls ganz übel, weil "&a" nach dem Return auf Stack zeigt, der einem nicht mehr gehört. Im besten Fall passiert gar nichts, im schlimmsten Fall bekommt man ganz üble Laufzeitfehler.

Ich würd das eher so sehen: Im besten Fall fliegt dir alles um die Oren und im schlechtesten Fall passiert gar nix. Denn der Code ist einfach nur falsch und wenn einem nicht alles um die Ohren fliegt, wird man auf den Fehler sehr wahrscheinlich nicht aufmerksam und kann ihn auch nicht ausbessern... ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

23.03.2013, 15:45

So kann man das natürlich auch sehen :) Durchaus.

@TGGC: Dann hat er aber bei Zuweisungen gründlich was verpennt. Das ist ist ja genau der Unterschied zwischen r-values und l-values. :)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige