Array of char Double Pointers

In this section, you are going to learn

How to use Double Pointers ?

How to use Array of Double Pointers ?

  • Step 1 : Create 3 characters

char c0 = 65, c1 = 66, c2 = 67;

OR

char c0, c1, c2;

c0 = 65;
c1 = 66;
c2 = 67;
  • Step 2 : Create 3 Single Pointers pointing to 3 Characters

char *sp0 = &c0, *sp1 = &c1, *sp2 = &c2;

OR

char *sp0, *sp1, *sp2;

sp0 = &c0;
sp1 = &c1;
sp2 = &c2;
  • Step 3 : Create 3 Double pointers pointing to 3 Single pointers

char **dp0 = &sp0, **dp1 = &sp1, **dp2 = &sp2;

OR

char **dp0, **dp1, **dp2;

dp0 = &sp0;
dp1 = &sp1;
dp2 = &sp2;
  • Step 4 : Define array of double pointers

char **ptr[] = { dp0, dp1, dp2 };

OR

char **ptr[3];

ptr[0] = dp0;
ptr[1] = dp1;
ptr[2] = dp2;

There are 3 double pointers in this example. dp0, dp1, dp2

  • See the full program below

#include <stdio.h>

int main(void)
{
        char c0 = 65, c1 = 66, c2 = 67;
        char *sp0 = &c0, *sp1 = &c1, *sp2 = &c2;
        char **dp0 = &sp0, **dp1 = &sp1, **dp2 = &sp2;

        char **ptr[] = { dp0, dp1, dp2 };

        for(int i = 0; i < 3; i++) {
                printf("%d\n", **ptr[i]);
        }

        return 0;
}

OR

#include <stdio.h>

int main(void)
{
        char c0 = 65, c1 = 66, c2 = 67;
        char *sp0 = &c0, *sp1 = &c1, *sp2 = &c2;

        char **ptr[] = { &sp0, &sp1, &sp2 };

        for(int i = 0; i < 3; i++) {
                printf("%d\n", **ptr[i]);
        }

        return 0;
}
  • Step 1 : Define a double dimension array

char darr[][10] = {"Laptop", "Mouse", "Keyboard"};
  • Step 2 : Define 3 Single pointers

char *sp0 = darr[0], *sp1 = darr[1], *sp2 = darr[2];

OR

char *sp0, *sp1, *sp2;

sp0 = darr[0];
sp1 = darr[1];
sp2 = darr[2];

OR

char *sp0, *sp1, *sp2;

sp0 = &darr[0][0];
sp1 = &darr[1][0];
sp2 = &darr[2][0];
  • Step 3 : Define array of double pointers

char **ptr[3] = {&sp0, &sp1, &sp2};

OR

char **ptr[3];

ptr[0] = &sp0;
ptr[1] = &sp1;
ptr[2] = &sp2;
  • Step 4 : Access strings using array of double pointers

for(int i = 0; i < 3; i++) {
        printf("%s\n", *ptr[i]);
}
  • See the full program below

#include <stdio.h>

int main(void)
{
        char darr[][10] = {"Laptop", "Mouse", "Keyboard"};

        char *sp0 = darr[0], *sp1 = darr[1], *sp2 = darr[2];

        char **ptr[3] = {&sp0, &sp1, &sp2};

        for(int i = 0; i < 3; i++) {
                printf("%s\n", *ptr[i]);
        }

        return 0;
}
  • Step 1 : Define 3 single pointers

char *sp0, *sp1, *sp2;
  • Step 2 : Allocate Heap memory

sp0 = malloc(10 * sizeof(char));
sp1 = malloc(10 * sizeof(char));
sp2 = malloc(10 * sizeof(char));
  • Step 3 : Copy user data (strings) to heap memory

strcpy(sp0, "Laptop");
strcpy(sp1, "Mouse");
strcpy(sp2, "KeyBoard");
  • Step 4 : Define array of double pointers

char **ptr[3] = {&sp0, &sp1, &sp2};
  • Step 5 : Use array of pointers to access strings

for(int i = 0; i < 3; i++) {
        printf("%s\n", *ptr[i]);
}
  • Step 6 : Free the heap memory after use

free(sp0);
free(sp1);
free(sp2);

OR

for(int i = 0; i < 3; i++) {
        free(*ptr[i]);
}
  • See the full program below

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

int main(void)
{
        char *sp0, *sp1, *sp2;

        sp0 = malloc(10 * sizeof(char));
        sp1 = malloc(10 * sizeof(char));
        sp2 = malloc(10 * sizeof(char));

        strcpy(sp0, "Laptop");
        strcpy(sp1, "Mouse");
        strcpy(sp2, "KeyBoard");

        char **ptr[3] = {&sp0, &sp1, &sp2};


        for(int i = 0; i < 3; i++) {
                printf("%s\n", *ptr[i]);
        }

        /* Free after Use : Method 1*/
        free(sp0);
        free(sp1);
        free(sp2);

        /* Free after Use : Method 2*/
        /*
        for(int i = 0; i < 3; i++) {
                free(*ptr[i]);
        }
        */

        return 0;
}
  • Step 1 : Define 3 double pointers

char **dp0, **dp1, **dp2;
  • Step 2 : Allocate Heap memory twice per double pointer

dp0 = malloc(sizeof(char *));
*dp0 = malloc(10 * sizeof(char));

dp1 = malloc(sizeof(char *));
*dp1 = malloc(10 * sizeof(char));

dp2 = malloc(sizeof(char *));
*dp2 = malloc(10 * sizeof(char));
  • Step 3 : Copy User data (strings) to heap

strcpy(*dp0, "Laptop");
strcpy(*dp1, "Mouse");
strcpy(*dp2, "Keyboard");
  • Step 4 : Define array of double pointers

char **ptr[3] = {dp0, dp1, dp2};
  • Step 5 : Access User data using array of pointers

for(int i = 0; i < 3; i++) {
        printf("%s\n", *ptr[i]);
}
  • Step 6 : Free after Use : Free *dp0, *dp1, *dp2

free(*dp0);
free(*dp1);
free(*dp2);

OR

for(int i = 0; i < 3; i++) {
        free(*ptr[i]);
}
  • Step 7 : Free after Use : Free dp0, dp1, dp2

free(dp0);
free(dp1);
free(dp2);

OR

for(int i = 0; i < 3; i++) {
        free(ptr[i]);
}
  • See the full program below

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

int main(void)
{
        char **dp0, **dp1, **dp2;

        dp0 = malloc(sizeof(char *));
        *dp0 = malloc(10 * sizeof(char));

        dp1 = malloc(sizeof(char *));
        *dp1 = malloc(10 * sizeof(char));

        dp2 = malloc(sizeof(char *));
        *dp2 = malloc(10 * sizeof(char));

        strcpy(*dp0, "Laptop");
        strcpy(*dp1, "Mouse");
        strcpy(*dp2, "Keyboard");

        char **ptr[3] = {dp0, dp1, dp2};

        for(int i = 0; i < 3; i++) {
                printf("%s\n", *ptr[i]);
        }

        for(int i = 0; i < 3; i++) {
                free(*ptr[i]);
        }

        for(int i = 0; i < 3; i++) {
                free(ptr[i]);
        }

        return 0;
}
  • Step 1 : Define array of double pointers

char **ptr[3];
  • Step 2 : Allocate heap memory twice per double pointer

ptr[0] = malloc(sizeof(char *));
*ptr[0] = malloc(10 * sizeof(char));

ptr[1] = malloc(sizeof(char *));
*ptr[1] = malloc(10 * sizeof(char));

ptr[2] = malloc(sizeof(char *));
*ptr[2] = malloc(10 * sizeof(char));

OR

for (int i = 0; i < 3; i++) {
        ptr[i] = malloc(sizeof(char *));
        *ptr[i] = malloc(10 * sizeof(char));
}
  • Step 3 : Copy User data (Strings) to heap using array of double pointers

strcpy(*ptr[0], "Laptop");
strcpy(*ptr[1], "Mouse");
strcpy(*ptr[2], "Keyboard");
  • Step 4 : Read User data (Strings) from heap using array of double pointers

for(int i = 0; i < 3; i++) {
        printf("%s\n", *ptr[i]);
}
  • Step 5 : Free after use

for(int i = 0; i < 3; i++) {
        free(*ptr[i]);
}

for(int i = 0; i < 3; i++) {
        free(ptr[i]);
}
  • See the full program below

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

int main(void)
{
        char **ptr[3];

        ptr[0] = malloc(sizeof(char *));
        *ptr[0] = malloc(10 * sizeof(char));

        ptr[1] = malloc(sizeof(char *));
        *ptr[1] = malloc(10 * sizeof(char));

        ptr[2] = malloc(sizeof(char *));
        *ptr[2] = malloc(10 * sizeof(char));

        strcpy(*ptr[0], "Laptop");
        strcpy(*ptr[1], "Mouse");
        strcpy(*ptr[2], "Keyboard");

        for(int i = 0; i < 3; i++) {
                printf("%s\n", *ptr[i]);
        }

        for(int i = 0; i < 3; i++) {
                free(*ptr[i]);
        }

        for(int i = 0; i < 3; i++) {
                free(ptr[i]);
        }

        return 0;
}
  • Step 1 : Define characters

char c0 = 65, c1 = 66, c2 = 67;
  • Step 2 : Define single pointers

char *sp0 = &c0, *sp1 = &c1, *sp2 = &c2;
  • Step 3 : Define double pointers

char **dp0 = &sp0, **dp1 = &sp1, **dp2 = &sp2;
  • Step 4 : Define Array of Double Pointers

char **ptr[] = { dp0, dp1, dp2 };
  • Step 5 : Pass Array of Double Pointers by Value

fun_v(ptr);
  • Step 6 : Define function fun_v

void fun_v(char **ptr_v[])
{
        for(int i = 0; i < 3; i++) {
                printf("%d\n", **ptr_v[i]);
        }
}
  • See the full program below

#include <stdio.h>

void fun_v(char **ptr_v[])
{
        for(int i = 0; i < 3; i++) {
                printf("%d\n", **ptr_v[i]);
        }
}

int main(void)
{
        char c0 = 65, c1 = 66, c2 = 67;
        char *sp0 = &c0, *sp1 = &c1, *sp2 = &c2;
        char **dp0 = &sp0, **dp1 = &sp1, **dp2 = &sp2;

        char **ptr[] = { dp0, dp1, dp2 };

        fun_v(ptr);

        return 0;
}
  • Step 1 : Define characters

char c0 = 65, c1 = 66, c2 = 67;
  • Step 2 : Define single pointers

char *sp0 = &c0, *sp1 = &c1, *sp2 = &c2;
  • Step 3 : Define double pointers

char **dp0 = &sp0, **dp1 = &sp1, **dp2 = &sp2;
  • Step 4 : Define a new type using typedef

typedef char **tptr[];
  • Step 5 : Define Array of Double Pointers

tptr ptr = { dp0, dp1, dp2 };
  • Step 6 : Pass Array of Double Pointers by Value

fun_v(ptr);
  • Step 7 : Define function fun_v

void fun_v(tptr ptr_v)
{
        for(int i = 0; i < 3; i++) {
                printf("%d\n", **ptr_v[i]);
        }
}
  • See the full program below

#include <stdio.h>

typedef char **tptr[];

void fun_v(tptr ptr_v)
{
        for(int i = 0; i < 3; i++) {
                printf("%d\n", **ptr_v[i]);
        }
}

int main(void)
{
        char c0 = 65, c1 = 66, c2 = 67;
        char *sp0 = &c0, *sp1 = &c1, *sp2 = &c2;
        char **dp0 = &sp0, **dp1 = &sp1, **dp2 = &sp2;

        tptr ptr = { dp0, dp1, dp2 };

        fun_v(ptr);

        return 0;
}
  • Step 1 : Define characters

char c0 = 65, c1 = 66, c2 = 67;
  • Step 2 : Define single pointers

char *sp0 = &c0, *sp1 = &c1, *sp2 = &c2;
  • Step 3 : Define double pointers

char **dp0 = &sp0, **dp1 = &sp1, **dp2 = &sp2;
  • Step 5 : Define Array of Double Pointers

char **ptr[] = { dp0, dp1, dp2 };
  • Step 6 : Pass Array of Double Pointers by Reference

fun_r(&ptr);
  • Step 7 : Define function fun_r

void fun_r(char ** (*ptr_r)[3])
{
        for(int i = 0; i < 3; i++) {
                printf("%d\n", (***ptr_r)[i]);
        }
}
  • See the full program below

#include <stdio.h>

void fun_r(char ** (*ptr_r)[3])
{
        for(int i = 0; i < 3; i++) {
                printf("%d\n", (***ptr_r)[i]);
        }
}

int main(void)
{
        char c0 = 65, c1 = 66, c2 = 67;
        char *sp0 = &c0, *sp1 = &c1, *sp2 = &c2;
        char **dp0 = &sp0, **dp1 = &sp1, **dp2 = &sp2;

        char **ptr[] = { dp0, dp1, dp2 };

        fun_r(&ptr);

        return 0;
}
  • Step 1 : Define characters

char c0 = 65, c1 = 66, c2 = 67;
  • Step 2 : Define single pointers

char *sp0 = &c0, *sp1 = &c1, *sp2 = &c2;
  • Step 3 : Define double pointers

char **dp0 = &sp0, **dp1 = &sp1, **dp2 = &sp2;
  • Step 4 : Define a new type using typedef

typedef char **tptr[];
  • Step 5 : Define Array of Double Pointers

tptr ptr = { dp0, dp1, dp2 };
  • Step 6 : Pass Array of Double Pointers by Reference

fun_r(&ptr);
  • Step 7 : Define function fun_r

void fun_r(tptr *ptr_r)
{
        for(int i = 0; i < 3; i++) {
                printf("%d\n", (***ptr_r)[i]);
        }
}
  • See the full program below

#include <stdio.h>

typedef char **tptr[];

void fun_r(tptr *ptr_r)
{
        for(int i = 0; i < 3; i++) {
                printf("%d\n", (***ptr_r)[i]);
        }
}

int main(void)
{
        char c0 = 65, c1 = 66, c2 = 67;
        char *sp0 = &c0, *sp1 = &c1, *sp2 = &c2;
        char **dp0 = &sp0, **dp1 = &sp1, **dp2 = &sp2;

        tptr ptr = { dp0, dp1, dp2 };

        fun_r(&ptr);

        return 0;
}