In the previous post, we learned how to get the memory address of a variable and how to define a variable that holds the memory address i.e pointer.
Suppose that there is a variable of the type int
called number
. We initialize it with value equals to 10. Now, suppose that it has a memory address 091 (Sounds ridiculous but it’s just a supposition). This memory address is present somewhere in our device’s memory.
Some of the memory addresses are shown in the table below, along with the values present in each.
Address | 090 | 091 | 092 | 093 | 094 | 095 |
---|---|---|---|---|---|---|
Value | Garbage | number | number | number | number | Garbage |
Now, we know that number
has a memory address 091. Then, why 092, 093 and 094 are also filled with value, number
? Well, just think a little about why not 095? 095 is just a garbage value!
Okay, okay! Let me clear this confusion. number
is of type int
and the size of int
is 4 bytes. Each memory address carries 1 byte. Therefore, to fit a variable of the type int
, it requires 4 neighbouring memory addresses.
So, number
is having memory addresses, 091, 092, 093 and 094. But the only memory address that is useful to us, is the first one i.e 091. Every variable only knows its first memory address and its size. When we know the first memory address of a variable, we can easily get the value of that variable.
Now, suppose that we have a pointer of the type int
called pNumber
. We initialize it with the memory address of the number
(How to get the memory address of a variable? By putting an ampersand(&) behind it).
Now, the pNumber
is also 091. We dereference it (i.e we put an asterisk(*) behind the pNumber
) to get the value 10.
Actually, when we dereference the pointer, we are actually, looking up the memory address which in this case, is 091. A pointer of type int
will suggest that whatever is present in this memory address will be the starting byte of the variable which is of type int
.
Please read the above statement twice! It is a bit tricky!
To make it easy, here’s the same table:
Address | 090 | 091 | 092 | 093 | 094 | 095 |
---|---|---|---|---|---|---|
Value | Garbage | number —–> pNumber | number | number | number | Garbage |
After looking up the memory address, pointer takes the value which in this case, is 10.
If you try sizeof()
for the pointer of any type, it will tell you that the size of the pointer is 8 bytes (or may be different depending on your device). This is because a pointer consists memory address and the memory address is a hexadecimal value. Hexadecimal values are big values! Therefore, every pointer resembles to type long int
which is also 8 bytes in size.
We can manipulate with the pointers as well. We will discuss it in the upcoming posts in detail. For now, just get along with pointers and the concept described above. It should not be hard now! There is still a huge ground to cover regarding pointers…