un puntatore a puntatore è semplicemente un puntatore che quando lo dereferenzi ti riferisci ad un altro puntatore, quindi da trattare come tale e per riferirsi al valore vero e proprio puntato bisogna dereferenziare ancora.

Ecco un piccolo esempio:

codice:
#include <stdio.h>

int main() {
	int i, j;
	char* test[3] = {"123", "123", "123"};
	for(i = 0; i < 3; i++) {
		for(j = 0; j < 3; j++) {
			printf("%c", *((*(test + i)) + j));
		}
	}


	return 0;
}
*((*(test + i)) + j)

questa parte vuol dire, fai puntare test all'elemento i-esimo, dereferenzialo(con *, quindi da ora in poi ci riferiremo all'altro puntatore), sposta il secondo puntatore al j-esimo elemento.

Quindi se vuoi riferirti al secondo carattere della seconda stringa devi fare: *((*(test + 1)) + 1)


E' ciaro?