#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)); // 4
printf("sizeof p = %zu\n", sizeof p); // 8
printf("sizeof q = %zu\n", sizeof q); // 8
printf("&a = %p\n", (void *)&a); // 0x1000
printf("&p = %p\n", (void *)&p); // 0x2000
printf("&q = %p\n", (void *)&q); // 0x3000

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));
	// your code goes here
	return 0;
}
