Search code examples
c++pointersvolatile

Can a pointer be volatile?


Consider the following code:

int square(volatile int *p)
{
    return *p * *p;
}

Now, the volatile keyword indicates that the value in a memory location can be altered in ways unknown to the compiler or have other unknown side effects (e.g. modification via a signal interrupt, hardware register, or memory mapped I/O) even though nothing in the program code modifies the contents.

So what exactly happens when we declare a pointer as volatile?

Will the above mentioned code always work, or is it any different from this:

int square(volatile int *p)
{
    int a = *p;
    int b = *p
    return a*b;
}

Can we end up multiplying different numbers, as pointers are volatile?

Or is there better way to do so?


Solution

  • Can a pointer be volatile?

    Absolutely; any type, excluding function and references, may be volatile-qualified.

    Note that a volatile pointer is declared T *volatile, not volatile T*, which instead declares a pointer-to-volatile.

    A volatile pointer means that the pointer value, that is its address and not the value pointed to by, may have side-effects that are not visible to the compiler when it's accessed; therefore, optimizations deriving from the "as-if rule" may not be taken into account for those accesses.


    int square(volatile int *p) { return *p * *p; }

    The compiler cannot assume that reading *p fetches the same value, so caching its value in a variable is not allowed. As you say, the result may vary and not be the square of *p.

    Concrete example: let's say you have two arrays of ints

    int a1 [] = { 1, 2, 3, 4, 5 };
    int a2 [] = { 5453, -231, -454123, 7565, -11111 };
    

    and a pointer to one of them

    int * /*volatile*/ p = a1;
    

    with some operation on the pointed elements

    for (int i = 0; i < sizeof(a1)/sizeof(a1[0]); ++i) 
           *(p + i) *= 2;
    

    here p has to be read each iteration if you make it volatile because, perhaps, it may actually point to a2 due to external events.