Do you mean that you want to pass 2 variables, the array 'a' and the GtkImage 'one' to the callback funtion? We often use a struct for this (or create an object or widget if applicable).
Also, you might want to call gtk_main_quit on the window's destroy event.
Code:
#include <iostream>
#include <gtk/gtk.h>
typedef struct
{
int a[2];
GtkWidget *one;
} MyStruct;
void print (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
{
MyStruct *s;
s = (MyStruct *)user_data;
gtk_image_set_from_file(GTK_IMAGE(s->one),"x.jpg");
std::cout << s->a[1];
}
int main (int argc, char *argv[])
{
GtkWidget *event_box;
GtkWidget *window;
MyStruct *s;
s = g_slice_new (MyStruct);
s->a[1]=1;
s->a[2]=2;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
s->one = gtk_image_new_from_file ("blank.jpg");
event_box = gtk_event_box_new ();
gtk_widget_add_events(event_box, GDK_BUTTON_PRESS_MASK);
gtk_container_add (GTK_CONTAINER (event_box), s->one);
/* call gtk_main_quit() when window is destroyed */
g_signal_connect (G_OBJECT (window),
"destroy",
G_CALLBACK (gtk_main_quit),
NULL);
g_signal_connect (G_OBJECT (event_box),
"button_release_event",
G_CALLBACK (print),
s);
gtk_container_add (GTK_CONTAINER (window), event_box);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}