Почему argvобъявляется как «указатель на указатель на первый индекс массива», а не просто как «указатель на первый индекс массива» ( char* argv)?
Почему здесь требуется понятие «указатель на указатель»?
char* argv[]ставит пространство не в том месте. Скажем char *argv[], и теперь ясно, что это означает, что «выражение *argv[n]является переменной типа char». Не пытайтесь понять, что такое указатель, что указывает на указатель и так далее. Декларация говорит вам, какие операции вы можете выполнить с этой вещью.
char * argv[]с аналогичной конструкцией C ++ std::string argv[], и, возможно, будет проще разобрать. ... Только не начинай писать так!
char &func(int);который не &func(5)имеет типа char.

char* argv[]илиchar**. Это указатель на указатель на символ; в частности, внешний указатель указывает на первый указатель в массиве, а внутренние указатели указывают на первые символы строк с нулевым символом в конце. Здесь нет индексов.