Home

Demystifying C Pointers: What Actually Happens in printf

If you are learning C, you have probably run into a line of code that looks like this and wondered what all the strange symbols mean:

printf("%p\n", (void *)&value);

It looks like a random assortment of punctuation, but it is actually a precise set of instructions telling the computer how to find and display a location in memory.

To understand it, let’s use a simple analogy: a house and its street address.

The House Analogy

Imagine your computer’s memory (RAM) is a massive neighborhood filled with houses.

Breaking Down the Code

When you run printf("%p\n", (void *)&value);, three distinct operations happen in a single line:

Component What it does Connection to the Analogy
&value The address-of operator. It tells the program: “Don’t look at the data inside the variable; look up its location in RAM.” Finding the street address of the house.
(void *) A type cast. It temporarily converts our specific integer address into a generic, universal pointer type. C standard rules require this to prevent compiler warnings. Standardizing the format so the mail carrier can read it, no matter what kind of building stands there.
%p The pointer format specifier. This tells printf to format and print the data as a hexadecimal memory address (usually looking like 0x7ffeed001234). Telling the printer to output the text as an official address format.

Why the (void *) Cast Matters

You might wonder why we can’t just write printf("%p", &value);. While many compilers will let you get away with it, the official C standard specifies that %p expects a generic void * pointer. Explicitly adding (void *) ensures your code is fully compliant and won’t trigger unexpected warnings on stricter compilers.

Printing Address Using a Pointer Variable

You can also print the address using a pointer variable instead of the & operator:

int value = 42;
int *ptr = &value;

// These two statements produce identical output
printf("Address using &: %p\n", (void *)&value);
printf("Address using ptr: %p\n", (void *)ptr);

Both will display the same memory address because ptr holds the address of value.

Tags: CPointersPrintfMemoryProgramming