Thursday 21 November 2019

c - Why use double indirection? or Why use pointers to pointers?



When should a double indirection be used in C? Can anyone explain with a example?



What I know is that a double indirection is a pointer to a pointer. Why would I need a pointer to a pointer?


Answer



If you want to have a list of characters (a word), you can use char *word




If you want a list of words (a sentence), you can use char **sentence



If you want a list of sentences (a monologue), you can use char ***monologue



If you want a list of monologues (a biography), you can use char ****biography



If you want a list of biographies (a bio-library), you can use char *****biolibrary



If you want a list of bio-libraries (a ??lol), you can use char ******lol




... ...



yes, I know these might not be the best data structures






Usage example with a very very very boring lol



#include 

#include
#include

int wordsinsentence(char **x) {
int w = 0;
while (*x) {
w += 1;
x++;
}
return w;

}

int wordsinmono(char ***x) {
int w = 0;
while (*x) {
w += wordsinsentence(*x);
x++;
}
return w;
}


int wordsinbio(char ****x) {
int w = 0;
while (*x) {
w += wordsinmono(*x);
x++;
}
return w;
}


int wordsinlib(char *****x) {
int w = 0;
while (*x) {
w += wordsinbio(*x);
x++;
}
return w;
}

int wordsinlol(char ******x) {

int w = 0;
while (*x) {
w += wordsinlib(*x);
x++;
}
return w;
}

int main(void) {
char *word;

char **sentence;
char ***monologue;
char ****biography;
char *****biolibrary;
char ******lol;

//fill data structure
word = malloc(4 * sizeof *word); // assume it worked
strcpy(word, "foo");


sentence = malloc(4 * sizeof *sentence); // assume it worked
sentence[0] = word;
sentence[1] = word;
sentence[2] = word;
sentence[3] = NULL;

monologue = malloc(4 * sizeof *monologue); // assume it worked
monologue[0] = sentence;
monologue[1] = sentence;
monologue[2] = sentence;

monologue[3] = NULL;

biography = malloc(4 * sizeof *biography); // assume it worked
biography[0] = monologue;
biography[1] = monologue;
biography[2] = monologue;
biography[3] = NULL;

biolibrary = malloc(4 * sizeof *biolibrary); // assume it worked
biolibrary[0] = biography;

biolibrary[1] = biography;
biolibrary[2] = biography;
biolibrary[3] = NULL;

lol = malloc(4 * sizeof *lol); // assume it worked
lol[0] = biolibrary;
lol[1] = biolibrary;
lol[2] = biolibrary;
lol[3] = NULL;


printf("total words in my lol: %d\n", wordsinlol(lol));

free(lol);
free(biolibrary);
free(biography);
free(monologue);
free(sentence);
free(word);
}



Output:



total words in my lol: 243

No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...