
#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));

    return 0;
}
