指针数组不太理解,还有指针的指针也有疑惑

问题遇到的现象和发生背景

char **q,不明白为什么要定义指针的指针

用代码块功能插入代码,请勿粘贴截图
#include
void main()
{
    char *s[]={"man","woman","girl","boy","sister"};
    char **q;
    int k;
    for(k=0;k<5;k++)
    {
        q=s+k;
        printf("%s\n",*q);
    }
    
}

运行结果及报错内容
man
woman
girl
boy
sister

请按任意键继续. . .

我的解答思路和尝试过的方法

char *s[]={"man","woman","girl","boy","sister"};这里定义了指针数组,数组内存放的是四个指针

我想要达到的结果

*q就能取出里面的单词的时候,定义**q是为什么,不定义又不能输出正确结果

这么和你说吧,char *a = "string" 会先创建一个内存存放字符串"string"。然后再让你的指针a指向这个字符串开始的位置。
同理 char *s[]={"man","woman","girl","boy","sister"}; 就是创建了一个指针列表。
当你单独写s时,s返回的是 地址 , 相当于&s[0] 这个的结果也就是存放s[0]这个指针的地址。所以你需要用二级的指针去获取。