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