*Markus: (C) Verständnisfrage zu Pointer

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

  1. 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

    1. 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

      1. 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

        1. 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