Welche Funktion hat ein Sternchen vor einem Funktionsnamen?

Lesezeit: 5 Minuten

Benutzeravatar von Aldee
Aldee

Ich war verwirrt mit dem, was ich in den meisten C-Programmen sehe, die eine für mich unbekannte Funktionsdeklaration haben.

void *func_name(void *param){
    ...
}

Was macht * für die Funktion bedeuten? Mein Verständnis von (*) in einem Variablentyp besteht darin, dass ein Zeiger auf eine andere Variable erstellt wird, sodass nachverfolgt werden kann, an welcher Adresse die letztere Variable im Speicher gespeichert ist. Aber in diesem Fall einer Funktion weiß ich nicht, was das ist * Sternchen impliziert.

  • Es wäre eine sehr interessante Frage, die Person, die den Code geschrieben hat, zu fragen, warum sie das Sternchen neben den Namen der Funktion gesetzt hat, anstatt void* func_name oder void * func_name. Wenn sie ein rationales Argument dafür finden könnten, wäre ich beeindruckt.

    – Ludin

    18. Januar 2012 um 15:28 Uhr


  • Rationelles Argument: Da wir daran gewöhnt sind, “int *a” zu schreiben, scheint es konsequenter zu sein, dasselbe für Funktionen zu tun

    – Guillaume

    18. Januar 2012 um 16:28 Uhr

  • Zusätzlich zu dem, was Guillaume geschrieben hat, ist das Herauskommen der Funktion ein Zeiger, der ungültig ist. genauso wie mit int *a es ist ein Zeigen auf eine ganze Zahl, nicht dass a vom Typ ganzzahliger Zeiger ist.

    – dhein

    17. Juli 2015 um 9:49 Uhr

  • @Guillaume idiotisches Zeug. Weil mein Lehrer so dachte wie du, kam ich immer mit Hinweisen durcheinander. Warum zum Teufel sollten wir schreiben int *a an erster Stelle, hier wie die Deklaration in C++ geht: [type] [name]. a ist eine Variable vom Typ “Zeiger auf int”, warum zum Teufel sollten wir ein Sternchen auf die andere Seite eines Leerzeichens setzen? Es hat nichts mit dem Namen zu tun, es bezieht sich auf den TYP, a ist vom Typ “POINTER TO INT”. Ich habe meinem Lehrer vor 10 Jahren genau dieselbe Frage gestellt, die OP geschrieben hat, was zum Teufel ist ein Sternchen vor dem Funktionsnamen, was hat es mit dem Funktionsnamen zu tun?

    – Römisch

    18. April 2016 um 14:08 Uhr


  • @ Zaibis genau a ist vom Typ Integer-Zeigeraber so wird es richtig gesagt: a ist vom Typ POINTER TO INTEGER

    – Römisch

    18. April 2016 um 14:13 Uhr


Das Sternchen gehört zum Rückgabetyp und nicht zum Funktionsnamen, also:

void* func_name(void *param) { . . . . . }

Das bedeutet, dass die Funktion eine Leere zurückgibt Zeiger.

  • Danke für die Antworten Jungs, aber was bedeutet ein Void-Zeiger?

    – Aldee

    18. Januar 2012 um 13:55 Uhr

  • Es ist nur eine Adresse zu einem Speicherort. Sie wissen nicht, worauf er zeigt – es liegt an Ihnen, den Zeiger auf einen geeigneten Typ umzuwandeln, den Sie später verwenden können. Wenn Sie es in einen ungültigen Typ umwandeln (sagen wir zum Beispiel, dass void* auf einen Float zeigt, Sie es aber in ein Zeichen umwandeln), führt dies zu undefinierten Ergebnissen.

    – Daniel Kamil Kozar

    18. Januar 2012 um 13:56 Uhr

  • @AldeeMativo: Siehe auch stackoverflow.com/questions/692564/…

    – NPE

    18. Januar 2012 um 13:57 Uhr

  • @DanielKamilKozar In C setzen wir keine Pointer-to-void. Wir weisen sie einfach zu. So funktioniert es standardisiert. (Im Gegensatz zu C++, das ein völlig anderes Biest ist.)

    – Jens

    5. August 2014 um 20:53 Uhr

  • @Jens: Stimmt natürlich. Danke für den Hinweis. Glücklicherweise hat sich mein Wissen seitdem verbessert. 🙂

    – Daniel Kamil Kozar

    6. August 2014 um 13:35 Uhr


Benutzeravatar von Vincenzo Pii
Vincenzo Pii

Das * bezieht sich auf den Rückgabetyp der Funktion, nämlich void *.

Wenn Sie eine Zeigervariable deklarieren, ist es dasselbe, die zu setzen * in der Nähe des Variablennamens oder des Variablentyps:

int *a;
int* a;

Ich persönlich halte die erste Wahl für übersichtlicher, denn wenn Sie mehrere Zeiger mit der definieren möchten , Trennzeichen, müssen Sie wiederholen * jedes Mal:

int *a, *b;

Die Verwendung der “typnahen Syntax” kann in diesem Fall irreführend sein, denn wenn Sie schreiben:

int* a, b;

Sie deklarieren einen Zeiger auf int (a) und ein int (b).

Sie finden diese Syntax also auch in Funktionsrückgabetypen!

  • “wenn Sie mehrere Zeiger mit dem Operator , definieren möchten”. Dies wird als schlechter Programmierstil angesehen, da es zu Fehlern führt, wenn Zeiger und Variablen desselben Typs kombiniert werden. Die Lösung besteht nicht darin, die Art und Weise zu verschleiern, wie Sie Zeiger deklarieren, sondern darin deklarieren Sie jede Variable in einer eigenen Zeile. Es gibt keinen Fall, in dem es sinnvoll ist, mehrere Variablen in derselben Zeile zu deklarieren. Was versuchst du damit zu erreichen, Tastaturdrücke zu sparen? Natürlich ist die Abnutzung der Tastatur eine ernstere Angelegenheit als die Lesbarkeit des Codes …

    – Ludin

    18. Januar 2012 um 15:35 Uhr


  • Ich habe nie gesagt, dass ich das mache. Ich sagte, dies sei ein Grund, die Syntax “close-to-variable-name” zu bevorzugen, da sie niemals Verwirrung stifte. Und ich sagte, das ist eine mögliche Erklärung für dieselbe Syntax, die in Funktionsschnittstellen verwendet wird.

    – Vincenzo Pii

    18. Januar 2012 um 16:45 Uhr

  • if you want to define multiple pointers using the , operator, you will have to repeat the * each time: int *a, *b; In diesem Zusammenhang ist das Komma ein Trennzeichen, kein Operator.

    – Dan

    19. Januar 2012 um 3:24 Uhr


  • Aber warum für Funktionsdeklarationen?

    – SOFe

    9. Juli 2016 um 8:56 Uhr


  • @PEMapModder, das ist nur der Rückgabetyp der Funktion, in diesem Fall ein Zeiger auf void.

    – Vincenzo Pii

    10. Juli 2016 um 10:09 Uhr

Benutzeravatar von x4u
x4u

Das * gehört zum Rückgabetyp. Diese Funktion kehrt zurück void *ein Zeiger auf einen Speicherort eines nicht spezifizierten Typs.

Ein Zeiger ist selbst ein Variablentyp, der die Adresse einer Speicherstelle als Wert hat. Die verschiedenen Zeigertypen in C stellen die verschiedenen Typen dar, von denen Sie erwarten, dass sie sich an dem Speicherort befinden, auf den sich die Zeigervariable bezieht. Also ein int * soll sich auf einen Ort beziehen, der als interpretiert werden kann int. Aber ein void * ist ein Zeigertyp, der auf eine Speicherstelle eines nicht spezifizierten Typs verweist. Sie müssen einen solchen void-Zeiger umwandeln, um auf die Daten an dem Speicherort zugreifen zu können, auf den er verweist.

Das bedeutet, dass die Funktion a zurückgibt void*.

1417880cookie-checkWelche Funktion hat ein Sternchen vor einem Funktionsnamen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy