How do pointers-to-pointers work in C?
When might you use them?
Let's assume an 8 bit computer with 8 bit addresses (and thus only 256 bytes of memory). This is part of that memory (the numbers at the top are the addresses):
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
| | 58 | | | 63 | | 55 | | | h | e | l | l | o | \0 | |
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
What you can see here, is that at address 63 the string "hello" starts. So in this case, if this is the only occurrence of "hello" in memory then,
const char *c = "hello";
... defines c
to be a pointer to the (read-only) string "hello", and thus contains the value 63. c
must itself be stored somewhere: in the example above at location 58. Of course we can not only point to characters, but also to other pointers. E.g.:
const char **cp = &c;
Now cp
points to c
, that is, it contains the address of c
(which is 58). We can go even further. Consider:
const char ***cpp = &cp;
Now cpp
stores the address of cp
. So it has value 55 (based on the example above), and you guessed it: it is itself stored at address 60.
As to why one uses pointers to pointers:
t
, a reference to the array has type t *
. Now consider an array of arrays of type t
: naturally a reference to this 2D array will have type (t *)*
= t **
, and is hence a pointer to a pointer.char **
.f
will need to accept an argument of type t **
if it is to alter a variable of type t *
.