#include <stdio.h>

int main(void) 
{
 int a[] = {10, 20, 30 ,40, 50};
 int *p = a;
 int (*q)[5] = &a;
 
 printf("sizeof(int) = %zu\n", sizeof(int));
 printf("sizeof p = %zu\n", sizeof p);
 printf("sizeof q = %zu\n", sizeof q);
 printf("&a = %p\n", (void *)&a);
 printf("&p = %p\n", (void *)&p);
 printf("&q = %p\n", (void *)&q);

 printf("*a = %d\n", *a);
 printf("a[3] = %d\n", a[3]);
 printf("*(a + 3) = %d\n", *(a + 3));
 printf("(a + 2)[1] = %d\n", (a + 2)[1]);
 printf("(1 + a)[2] = %d\n", (1 + a)[2]);
 printf("*(3 + a) = %d\n", *(3 + a));
 printf("3[a] = %d\n", 3[a]);
 printf("2[a + 1] = %d\n", 2[a + 1]);

 printf("a + 1 = %p\n", (void *)(a + 1));
 printf("&a[1] = %p\n", (void *)&a[1]);
 printf("&a[1] + 1 = %p\n", (void *)(&a[1] + 1));
 printf("&*a = %p\n", (void *)&*a);
 printf("&*a + 1 = %p\n", (void *)(&*a + 1));
 printf("&a + 1 = %p\n", (void *)(&a + 1));

 printf("*p = %d\n", *p);
 printf("p[3] = %d\n", p[3]);
 printf("*(p + 3) = %d\n", *(p + 3));
 printf("(p + 2)[1] = %d\n", (p + 2)[1]);
 printf("(1 + p)[2] = %d\n", (1 + p)[2]); 
 printf("*(3 + p) = %d\n", *(3 + p));
 printf("3[p] = %d\n", 3[p]);
 printf("2[p + 1] = %d\n", 2[p + 1]);

 printf("p + 1 = %p\n", (void *)(p + 1));
 printf("&p[1] = %p\n", (void *)&p[1]);
 printf("&p[1] + 1 = %p\n", (void *)(&p[1] + 1));
 printf("&*p = %p\n", (void *)&*p);
 printf("&*p + 1 = %p\n", (void *)(&*p + 1));
 printf("&p + 1 = %p\n", (void *)(&p + 1));

 printf("**q = %d\n", **q);
 printf("(*q)[3] = %d\n", (*q)[3]);
 printf("*(*q + 3) = %d\n", *(*q + 3));
 printf("(*q + 2)[1] = %d\n", (*q + 2)[1]);
 printf("(1 + *q)[2] = %d\n", (1 + *q)[2]);
 printf("*(3 + *q) = %d\n", *(3 + *q));
 printf("3[*q] = %d\n", 3[*q]);
 printf("2[*q + 1] = %d\n", 2[*q + 1]);

 printf("*q + 1 = %p\n", (void *)(*q + 1));
 printf("&(*q)[1] = %p\n", (void *)&(*q)[1]);
 printf("&(*q)[1] + 1 = %p\n", (void *)(&(*q)[1] + 1));
 printf("&**q + 1 = %p\n", (void *)(&**q + 1));
 printf("&*q + 1 = %p\n", (void *)(&*q + 1));
 printf("&q + 1 = %p\n", (void *)(&q + 1));

	return 0;
}