#include <stdio.h>

#define SIZE 5

int main(void)
{
    int values[SIZE] =
    { 2, 4, 6, 8, 10 };

    int *vPtr;

    printf("Using array subscript notation:\n");

    for (int i = 0; i < SIZE; ++i)
    {
        printf("%d\t", values[i]);
    }

    puts("");

    vPtr = values;

    printf("\nUsing pointer/offset notation:\n");

    for (int i = 0; i < SIZE; ++i)
    {
        printf("%d\t", *(vPtr + i));
    }

    puts("");

    printf("\nUsing pointer/offset notation with array name:\n");

    for (int i = 0; i < SIZE; ++i)
    {
        printf("%d\t", *(values + i));
    }

    puts("");

    printf("\nUsing pointer/subscript notation:\n");

    for (int i = 0; i < SIZE; ++i)
    {
        printf("%d\t", vPtr[i]);
    }

    puts("");

    printf("\nElement 4 using values[4] = %d\n",
           values[4]);

    printf("Element 4 using *(values + 4) = %d\n",
           *(values + 4));

    printf("Element 4 using vPtr[4] = %d\n",
           vPtr[4]);

    printf("Element 4 using *(vPtr + 4) = %d\n",
           *(vPtr + 4));

    printf("\nAddress referenced by vPtr + 3: %p\n",
           (void *)(vPtr + 3));

    printf("Value stored at that address: %d\n",
           *(vPtr + 3));

    vPtr = &values[4];

    vPtr -= 4;

    printf("\nAddress after vPtr -= 4: %p\n",
           (void *)vPtr);

    printf("Value stored at that address: %d\n",
           *vPtr);

    return 0;
}