¿Cómo entender la estrella puntero * en C?

Estoy luchando con el signo del puntero *, me resulta muy confuso cómo se usa tanto en declaraciones como en expresiones.

Por ejemplo

int *i; // i is a pointer to an int

Pero, ¿cuál es la lógica detrás de la sintaxis? ¿Qué significa el * justo antes del que quiero decir? Tomemos el siguiente ejemplo. Por favor corrígeme donde estoy equivocado:

char **s;
char *(*s); // added parentheses to highlight precedence

Y aquí es donde pierdo el rastro. El * s entre las paréntesis significa: s es un puntero? ¿Pero un puntero a qué? ¿Y qué significa el * fuera del paréntesis: un puntero a lo que s está apuntando?

Así que el significado de esto es: ¿El puntero que apunta a lo que está apuntando es un puntero a un personaje?

Estoy perdido. ¿El signo * se interpreta de manera diferente en las declaraciones y expresiones? Si es así, ¿cómo se interpreta de manera diferente? ¿Dónde me estoy equivocando?

Respuestas a la pregunta(10)

Su respuesta a la pregunta