pointer is a variable that stores the memory address of another variable as its value.

How to declare a pointer

int* p0;
int *p1;
int * p2;

Stranger case:

int* p1, p2;

Here, we have declared a pointer p1 and a normal variable p2.


Assigning addresses to Pointers

Let’s take an example.

int* pc, c;
c = 5;
pc = &c;

Here, 5 is assigned to the c variable. And, the address of c is assigned to the pc pointer.

Get Value of Thing Pointed by Pointers

To get the value of the thing pointed by the pointers, we use the * operator.

int* pc, c;
c = 5;
pc = &c;
printf("%d", *pc);   // Output: 5

Warning

Note: In the above example, pc is a pointer, not *pc. You cannot do something like *pc = &c;

By the way, * is called the dereference operator (when working with pointers). It operates on a pointer and gives the value stored in that pointer.


Changing Value Pointed by Pointers

int* pc, c;
c = 5;
pc = &c;
*pc = 1;
printf("%d", *pc);  // Ouptut: 1
printf("%d", c);    // Output: 1
  • We have assigned the address of c to the pc pointer.
  • Then, we changed *pc to 1 using *pc = 1;. Since pc and the address of c is the same, c will be equal to 1.

Let’s take one more example:

int* pc, c, d;
c = 5;
d = -15;
 
pc = &c; printf("%d", *pc); // Output: 5
pc = &d; printf("%d", *pc); // Ouptut: -15
  • Initially, the address of c is assigned to the pc pointer using pc = &c;. Since c is 5, *pc gives us 5.
  • Then, the address of d is assigned to the pc pointer using pc = &d;. Since d is -15, *pc gives us -15.

Common Mistakes

Suppose, you want pointer pc to point to the address of c.

int c, *pc;
 
// pc is address but c is not
pc = c;  // Error
 
// &c is address but *pc is not
*pc = &c;  // Error
 
// both &c and pc are addresses
pc = &c;  // Not an error
 
// both c and *pc are values 
*pc = c;  // Not an error

Here’s an example of pointer syntax beginners often find confusing.

#include <stdio.h>
int main() {
   int c = 5;
   int *p = &c;
 
   printf("%d", *p);  // 5
   return 0; 
}

Why didn’t we get an error when using int *p = &c;?

It’s because

int *p = &c;

is equivalent to

int *p:
p = &c;

In both cases, we are creating a pointer p (not *p) and assigning &c to it. To avoid this confusion, we can use the statement like this:

int* p = &c;

Long Example: Working of Pointers

Let’s take a working example.

#include <stdio.h>
int main()
{
   int* pc, c;
   
   c = 22;
   printf("Address of c: %p\n", &c);
   printf("Value of c: %d\n\n", c);  // 22
   
   pc = &c;
   printf("Address of pointer pc: %p\n", pc);
   printf("Content of pointer pc: %d\n\n", *pc); // 22
   
   c = 11;
   printf("Address of pointer pc: %p\n", pc);
   printf("Content of pointer pc: %d\n\n", *pc); // 11
   
   *pc = 2;
   printf("Address of c: %p\n", &c);
   printf("Value of c: %d\n\n", c); // 2
   return 0;
}

Output

Address of c: 2686784 Value of c: 22

Address of pointer pc: 2686784 Content of pointer pc: 22

Address of pointer pc: 2686784 Content of pointer pc: 11

Address of c: 2686784 Value of c: 2


Explanation of the program

  1. int* pc, c;

    A pointer variable and a normal variable is created.

    Here, a pointer pc and a normal variable c, both of type int, is created.
    Since pc and c are not initialized at initially, pointer pc points to either no address or a random address. And, variable c has an address but contains random garbage value.
     

  2. c = 22;

    22 is assigned to variable c.

    This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.
     

  3. pc = &c;

    Address of variable c is assigned to pointer pc.

    This assigns the address of variable c to the pointer pc.
     

  4. c = 11;

    11 is assigned to variable c.

    This assigns 11 to variable c.
     

  5. *pc = 2;

    5 is assigned to pointer variable's address.

    This change the value at the memory location pointed by the pointer pc to 2.