Search code examples
cpointerspointer-arithmetic

Addition of a number to a pointer


#include<stdio.h>
int main()
{  
     float a=10;
     float* p=&a;
    printf("%u\n",p);
     p=p+3;
     printf("%u",p);
}

After execution of this program I got 2 memory addresses as an output, thelatter with a value greater by 12 than the former.

#include<stdio.h>
int main()
{  
     float a=10;
     float* p=&a;
    printf("%u\n",p);
     p=p+3.5;
     printf("%u",p);
}

I tried changing 3 to 3.5 but I got an output with equal values of both the addresses. I expected that the value would increment at least by 12 in either cases. What could be the reason ?


Solution

  • That's how pointer arithmetic works. It's designed to work on arrays.

    float array[4];
    float *q;
    q = array; /* Now q points to the first element of the array: q == &array[0] */
    printf("%p\n", q);
    q += 3; /* Now q points to the fourth element of the array: q == &array[3] */
    printf("%p\n", q);
    

    When you add an integer to a pointer, it points that many elements further into the array. If the size of the array elements is N bytes, then adding x to a pointer adds x*N to the address.

    On your machine, it appears that sizeof(float) is 4: you see that x*N=12, with x=3, so N=4.

    Note that there are several errors in your code. In your program, p=p+3 has undefined behavior because p points to a single float (which has the same memory layout as an array of 1 float). It is an error to make a pointer point outside the boundaries of an object. On a typical PC compiler you just silently get an invalid pointer; a rare few implementations would detect the invalid pointer as soon as it's computed and abort the program with an error.

    Printing the pointer value with %u is also an error. In practice it may work, print garbage, or crash, depending on your compiler and on whether pointers have the same size as unsigned int. Any halfway decent compiler would warn you that printf("%u", p) is incorrect; if yours doesn't, make sure to enable its useful warnings (e.g. gcc -O -Wall if you're using GCC).