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 ?
Basics of Array of Double Pointers
Example 1 : Array of character double pointers : Pointers pointing to variables
Example 3 : Array of character double pointers : Pointers pointing to Heap : Method 1
Example 4 : Array of character double pointers : Pointers pointing to Heap : Method 2
Example 5 : Array of character double pointers : Pointers pointing to Heap : Method 3
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;
}
Now let us look at,
Functions and Array of Double Pointers
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;
}
Current Module
Previous Module
Next Module
Other Modules