Double pointer usage and dynamic memory allocation using box diagram

Consider the below example,

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int **p;     /* A pointer to a pointer to an integer */
    int a;

    p = malloc(sizeof(int *));

    *p = malloc(sizeof(int)); /* OR *p = &a; */

    **p = 10;

    printf("a = %d  **p = %d\n", a, **p);
} 

Output:
a = 10 **p = 10

In the above example, 'p' is a double pointer which means, 'p' will point to another pointer which in-turn is pointing to an integer variable.

Now, we have 'p' which is a pointer to a pointer. 'p' has its memory allocated at some address location say, '1000'. Lets say 'p' is ponting to another pointer 'x' which is at the address '1004'. Then 'x' in-turn will be pointing to variable 'a' located at say, 1008.
Box Diagram representation of pointers

'p' points to 'x'.
'x' points to 'a'
p->x->a or (p->*p->**p)

if say, pointer 'x' is not declared, then the second link in the above representation will break.

p->( )->a or (p->( )->**p)

It means, there is no memory representing link-2 which will have the address of 'a'. Hence, by using dynamic memory allocation, we can first allocate a memory by declaring a pointer variable 'x' and make the link.

Or, dynamically allocate a memory of type (int *) and make 'p' to directly point to that memory and put the address of 'a' in that allocated memory. The above program represents the second case.

In other words,

if you have a double pointer say,
int **p;

It means, at the declaration, memory is allocated for the variable 'p' which can point to another integer pointer which in turn will point to an integer variable. i.e., if it is a double pointer, then there needs three memory locations, one for 'p' of type 'int **' (pointer to a integer pointer) which is allocated during declaration, another for '*p' of type 'int *' (pointer to an integer) and the third memory for integer to which it points to (say, an integer value '10'). So, two memory allocations are needed.
p = malloc(sizeof(int *));

*p = malloc(sizeof(int));

The first statement will allocate the second memory for *p (type: int *) and its address is stored in p (type: int **).

The second statement will allocate the third memory required to store an integer '10' (type: int) and its address is stored in *p (type: int *).

The third memory can also be  a integer variable (say, count) in which case, the second statement above can be modified as
*p = &count;

Similarly,

For triple pointer, ***p, there shall be 4 memory locations, 3 for pointers and one for the variable it is pointing to and so on..

But, why do we need a double or a tripple pointer?

Disclaimer:
The above article doesn't give you any guarantee and the sole purpose of this article is to share my learning in the way I understood. Any comments to refine this article are welcome with great pleasure. Please report any breaking link by commenting below.

Receive all updates via Facebook. Just Click the Like Button Below

You can also receive Free Email Updates:

dgpride - Study Zone - Free Books - Tamil Lyrics

Copyright © 2008 -2012 dgpride. All rights reserved.

Subject/Topics

2 Marks (26) 8051 (1) AC Machines (7) Animations (1) Anna University Chennai (31) Arduino (4) ARM (3) Audio (1) Basic C Concepts (8) Basic Electronics (13) Basic principles (9) Book list (1) CAD (1) Chemical (2) Circuit theory (6) Civil (2) Cloud Computing (1) Communication (4) Competitive exams (2) Computer Architecture (4) Control system and components (9) CSE (40) Curriculum (4) DC Machines (9) Did you know (14) Digital (13) DLC (4) Documentation (1) DSP (1) EC 2201 (3) ECE (45) EDC (1) EEE (34) EIE (63) Electrical (35) Electronics (43) Electroplating (2) Emacs (1) Embedded basics (19) Embedded C Programming (19) Embedded Linux (5) Embedded System (22) Engineering basics (15) Environmental Science (1) Fibre Optics (1) Filters (2) FPGA (1) GATE (3) General (7) GNU (4) Handwritten (1) Hobbyist (15) How to (8) HTML (3) Humanities (2) IC Engines (7) ICE (5) Industrial Electronics (10) Industrial Instrumentatin (2) industrial process (2) Instrumentation (21) IoT (2) IT (2) Laboratory Manuals (17) LabVIEW (2) Lesson notes (2) LIC (2) Links (9) Linux (8) Magnetics (1) Management (1) Mechanical (5) Mechatronics (9) Microcontrollers (14) Microprocessors (9) Microsoft (1) Motivation (1) Must Know (11) Networks (1) NuttX (1) Objective type (1) Open Source (1) Opportunities (7) Oscillators (2) Part Time (1) Physics (1) Post Graduation (1) Power Electronics (12) Power Plant Engineering (2) Power Supplies (2) Previous GATE Papers (1) Process Control (2) Project (4) Protocol (1) R2008 (11) R2009 (1) R2013 (1) Recruitment (2) Research (2) Robotics (9) RTOS (3) Signal Processing (8) Signals and Systems (4) SMPS (1) Software tutorial (4) Stepper Motor (2) Syllabus (5) Texas Instruments (2) Thermodynamics (2) Training and Placement (6) Transducer Engineering (2) Transformer (2) Transmission (1) Tutorials (48) Two Marks (26) U-Boot (1) University Question Papers (16) Verilog (1) Video (4) Virtual Instrumentation (3) Visual Basic (21) VLSI (11) Web designing (4) Wi-Fi (3) Wireless (6)