Current state of the program:

After executing the statements from the previous example, what will be displayed by the printf function?

*++*--ppstr = 'r';            /* ??? */
*(*ppstr += 2) = 'a';         /* ??? */
printf("%s\n", (*ppstr - 3)); /* ??? */
First statement:
*++*--ppstr = 'r';

Second statement:
*(*ppstr += 2) = 'a'; 

The statement:
printf("%s\n", (*ppstr - 3)); /* ??? */
will print the word Triad.
  1. ppstr is 1008 (pointer to pointer to char)
  2. *ppstr is 119 (pointer to char)
  3. *ppstr - 3 is 116 (119 - 3) (pointer to char)
  4. Printing a string (%s) starting at address 116 yields the word, Triad.

There is a slight caveat with the above code showing how to write to the static strings. Since some compilers store constant strings in the text segment (code) of the program, you can't modify the strings. The operations are correct, though. One way to make the strings "writeable" is to allocate the space on the runtime heap:
int i;
char *s[] = {"First", "Second", "Third", "Fourth"};
char *strings[4];
char **ppstr = strings;
for (i = 0; i < 4; i++)
{
  strings[i] = malloc(strlen(s[i]) + 1);
  strcpy(strings[i], s[i]);
}

/* modify the strings */

/* free the memory used by the strings */
Complete code for the above examples.