C Pointers
Creating Pointers
You learned from the previous chapter, that we can get the memory
address of a variable with the reference
operator &:
Example
int myAge = 43; // an int variable
printf("%d", myAge); //
Outputs the value of myAge (43)
printf("%p", &myAge); // Outputs the
memory address of myAge (0x7ffe5367e044)
Try it Yourself »
A pointer is a variable that stores the memory address of another variable as its value.
A pointer variable points to a variable of a specific data type (like int), and is created with the * operator.
The address of the variable you are working with is assigned to the pointer:
Example
int myAge = 43; // An int variable
int* ptr =
&myAge; // A pointer variable, with the name ptr, that
stores the address of myAge
// Output the value of myAge (43)
printf("%d\n", myAge);
// Output
the memory address of myAge (0x7ffe5367e044)
printf("%p\n", &myAge);
//
Output the memory address of myAge with the pointer (0x7ffe5367e044)
printf("%p\n", ptr);
Try it Yourself »
Example explained
Create a pointer variable with the name ptr, that points to an int variable (myAge). Note that the type of the pointer has to match the type of the variable you're
working with (int in our example).
Use the & operator to get the memory address of the myAge variable, and assign it to the pointer.
Now, ptr holds the value of myAge's memory address.
Dereference
In the example above, we used the pointer variable to get the memory address of a variable (used together with the & reference operator).
You can also get the value of the variable the pointer points to, by using the * operator (the dereference operator):
Example
int myAge = 43; // Variable declaration
int* ptr = &myAge; // Pointer
declaration
// Reference: Output the memory address of myAge with the
pointer (0x7ffe5367e044)
printf("%p\n", ptr);
// Dereference:
Output the value of myAge with the pointer (43)
printf("%d\n", *ptr);
Try it Yourself »
You can also use the dereference operator to change the value of the variable that the pointer points to:
Example
int myAge = 43; // Variable declaration
int* ptr = &myAge; // Pointer declaration
// Change the value of myAge with the pointer
*ptr = 50;
// Output the new value of myAge (50)
printf("%d\n", myAge);
Try it Yourself »
Note that the * sign can be confusing here, as it does two different things
in our code:
- When used in declaration (
int* ptr), it creates a pointer variable. - When not used in declaration, it acts as a dereference operator.
Visualize Pointers
Choose an expression below to see which part of the memory it reads:
Code
Memory
Output
Explanation
Two Ways to Declare Pointers
There are two ways to declare pointer variables in C:
int* myNum;
int *myNum;
Both ways do exactly the same thing, so it is up to you which one you use. Just use the same style in all your code.
Note: If you declare more than one variable on the same line, the * only belongs to the first one. int* a, b; creates a pointer named a, and a normal int named b. To create two pointers, write int *a, *b;
Notes on Pointers
Pointers are one of the things that make C stand out from other programming languages, like Python and Java.
They are important in C, because they let you work directly with the data in the computer's memory. For example, a function can change the value of a variable if it gets a pointer to it. This is how scanf() stores the user's input in your variable. You will learn how to do this yourself in the Pass By Reference chapter.
Pointers are also used to build data structures like lists, trees and graphs. And sometimes you even have to use pointers, for example when working with files and memory management.
But be careful; pointers must be handled with care, since it is possible to damage data stored in other memory addresses.