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?