C pointers rehearsal - MarekBykowski/readme GitHub Wiki

#include <stdio.h>
#include <string.h>

void main()
{
{
        int ar[4] = { 5 , 6 , 7 , 8 };
        int *pi = ar; /* ar is an address of the 0th element, set that addr to pi */
        int (*pa)[4] = (int (*)[4])ar;


        printf(" val %d @ pi %p\n", *pi, pi);

        /*
         * When you dereference a pointer to an array you get an array.
         * An array is an address of the 0th element of the array so you need to
         * dereference it again to get the 0th element of it.
         */
        printf(" val %d @ pa %p\n", **pa, pa);
}
{
        char *pmessage = "hello world"; /* string litral */
        char amessage[] = "hello world"; /* array containing hello world */
        int i;

        printf("pmessage val %s @ addr %p. pmessage pointer is allocated @ %p\n",
               pmessage, (void *)pmessage, (void **)&pmessage);
        printf("pmessage addr %p: val (being addr) %p\n", &pmessage, pmessage);

        for (i = 0; i < 4; i++) {
                printf("pmessage addr %p: val %c:%c:%c:%c\n",
                       pmessage + 4 * i,
                       *(pmessage + 4 * i)/*or pmessage[0]*/, *(pmessage + 4 * i + 1),
                       *(pmessage + 4 * i + 2), *(pmessage + 4 * i + 3));
                if (i * 4 + 3 >= sizeof(pmessage))
                        break;
        }

        printf("amessage %s @ %p\n", amessage, (void *)amessage);

        amessage[2] = 'b';
        printf("pmessage %s @ %p\n", pmessage, (void *)pmessage);
        printf("amessage %s @ %p\n", amessage, (void *)amessage);

        strncpy(amessage, "something else", sizeof(amessage));
        printf("pmessage %s @ %p\n", pmessage, (void *)pmessage);
        printf("amessage %s @ %p\n", amessage, (void *)amessage);

}
        return;
}
⚠️ **GitHub.com Fallback** ⚠️