*Markus: (C) Verständnisfrage zu Pointer

Beitrag lesen

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