(C) Verständnisfrage zu Pointer
*Markus
- sonstiges
1 Vinzenz Mai
Hallo,
ich hätte wieder mal eine kurze Verständnisfrage zur Pointerbehandlung, und zwar geht es um folgendes:
int main(int argc, char *argv[]) {
gint rating = 4;
gint *p_rating = &rating;
[...]
g_signal_connect(window, "button-press-event", G_CALLBACK(clicked), (gpointer)p_rating);
[...]
gtk_widget_show_all(window);
gtk_main();
g_print("rating (Schluss): %d\n", rating);
return 0;
}
------------------------------------------------
gboolean clicked(GtkWidget *widget, GdkEventButton *event, gpointer *user_data) {
gint *data = (gint *)user_data;
g_print("rating vor Änderung (clicked): %d\n", *data);
*data = 3;
g_print("rating (clicked): %d\n", *data);
return TRUE;
}
Folgende Ausgabe kommt dabei heraus:
$ ./sterntest
rating vor Änderung (clicked): 4
rating (clicked): 3
rating (Schluss): 3
Es funktioniert auch genauso, wie ich es haben will. Ich musste aber etwas herumprobieren, und bin mir nicht so ganz sicher, warum das nun korrekt funktioniert und zwar wegen dieser Zeile:
gint *data = (gint *)user_data;
Ich definiere einen Pointer auf gint und zeige damit wohin genau, nachdem ich eine Typumwandlung nach einem Pointer auf gint durchführte? Auf die Adresse des Pointers user_data selbst oder auf die Adresse der Variable, auf die user_data zeigt (also die Adresse von "rating")?
Wie ist das nun bei dieser Ausgabe?
g_print("rating vor Änderung (clicked): %d\n", *data);
Zeigt "data" zuerst auf den Pointer "user_data", der wiederum auf die Variable "rating" verweist, oder zeigt "data" direkt auf "rating"?
Danke für die Hilfe,
Markus
Hallo,
ich hätte wieder mal eine kurze Verständnisfrage zur Pointerbehandlung, und zwar geht es um folgendes:
gboolean clicked(GtkWidget *widget, GdkEventButton *event, gpointer *user_data) {
gint *data = (gint *)user_data;
ich halte Deine Schreibweise für den Hauptgrund, warum Du Verständnisschwierigkeiten hast. Schreib es anders!
gboolean clicked(GtkWidget* widget, GdkEventButton* event, gpointer* user_data) {
gint* data = (gint*) user_data;
siehe dazu </archiv/2008/10/t177894/#m1172691>
In
*data
hat der * eine ganz andere Funktion. Hier ist er der Dereferenzierungsoperator.
Gib mir das, auf was data (ein Zeiger auf gint) zeigt.
Freundliche Grüße
Vinzenz
Hallo,
gboolean clicked(GtkWidget* widget, GdkEventButton* event, gpointer* user_data) {
gint* data = (gint*) user_data;siehe dazu </archiv/2008/10/t177894/#m1172691>
In
*data
hat der * eine ganz andere Funktion. Hier ist er der Dereferenzierungsoperator.
Gib mir das, auf was data (ein Zeiger auf gint) zeigt.
Danke für den Tipp. Ich muss zugeben, dass es so wirklich gleich viel klarer ist, da man auf einen Blick sieht, wann man dereferenziert und wann man einen Zeiger deklariert.
Viele Grüße,
Markus
Moin.
Danke für den Tipp. Ich muss zugeben, dass es so wirklich gleich viel klarer ist, da man auf einen Blick sieht, wann man dereferenziert und wann man einen Zeiger deklariert.
Allerdings hat diese Schreibweise auch ihre Probleme: zB deklariert
gint* foo, bar;
keneiswegs zwei Zeiger.
Christoph
Hallo Christoph,
Allerdings hat diese Schreibweise auch ihre Probleme: zB deklariert
gint* foo, bar;
ein Punkt gegen die von mir bevorzugte Schreibweise, deswegen halte ich die Art der Schreibweise für Geschmackssache. Ich bevorzuge es, für jede Variable eine eigene Zeile zu nehmen. Möglicherweise hat dies seine Ursache in dem von Dir angeführten Problem :-)
Freundliche Grüße
Vinzenz