2009-07-16 4 views
1

Hii !, Ich programmiere in C/GTK +, aber ich verstehe noch nicht warum, wenn ich eine Funktion, wie gtk_label_set_text (GTK_LABEL (label), "some text"); zum Beispiel, ich brauche nicht die Referenz der Label-Zeiger auf die Funktion übergeben. Ich habe gelernt, dass C alle Argumente als Wert übergeben, als, die Funktion wird nicht die Widget-Bezeichnung beeinflussen, in anderen Bereichen. Vielen Dank und Entschuldigung mein schlechtes Englisch.Warum GTK + als Referenz übergeben?

Antwort

3

Sie übergeben einen Zeiger. GTK_LABEL (label) ist nur ein schickes Makro, das den Typ von 'label' umsetzt. Aber es funktioniert mit Zeigern, Sie übergeben einen Zeiger auf gtk_label_set_text.

Auch C übergibt alles nach Wert. Aber es ist der Zeiger, den Sie als Wert übergeben. Die Kopie des Zeigers zeigt immer noch auf dasselbe "Objekt", so dass gtk_label_set_text dasselbe Objekt wie der Aufrufer manipuliert.

-2

In C übergeben Sie einen Zeiger durch Verweis (int *pointer; myfunction(&pointer);), wenn Sie die Funktion zum Ändern des Zeigers benötigen, d. H. den Zeiger auf eine andere Speicheradresse setzen.

Wenn Sie den Text in einem GtkLabel ändern möchten, müssen Sie nicht ändern, wo der Label-Zeiger zeigt. Es zeigt bereits an der richtigen Stelle - eine Struktur, die wahrscheinlich irgendwo auf dem Haufen liegt. Alles, was Sie tun möchten, ist den Wert eines der Felder der Struktur ändern, um "etwas Text" zu lesen. Aus diesem Grund gibt die Gtk + API an, dass Sie in diesem Fall Ihren Label-Zeiger nach Wert übergeben müssen.

0

GTK_LABEL() ist ein Makro, das im Grunde einen generischen GtkWidget-Zeiger auf einen GtkLabel-Zeiger umsetzt. Wenn Sie ein GtkWidget * foo haben, das auf ein GtkLabel-Objekt zeigt, bedeutet GTK_LABEL(foo) mehr oder weniger dasselbe wie (GtkLabel*)foo. (Mit zusätzlichen Überprüfungen, dass das Objekt, auf das gezeigt wird, tatsächlich ein GtkLabel ist.) Es bedeutet nicht das "Label" im GtkLabel-Widget, wie Sie zu denken scheinen.