В основном, char * argv [] означает массив указателей на символы, тогда как char ** argv означает указатель на указатель char.
В любом массиве имя массива является указателем на первый элемент массива, то есть содержит адрес первого элемента.
Так в приведенном ниже коде в массиве символов x x является указателем на первый элемент, '1', который является символом. Так что это указатель на персонажа.
И в массиве arr, arr является указателем первого элемента x, который сам по себе является указателем на символ. Так что это указатель на другой указатель.
Следовательно, x является char *, а arr является char **.
Принимая что-то в функции, основное правило заключается в том, что вы должны указать тип вещи, которую вы получаете. Поэтому либо вы просто говорите, что хотите получить символ **, либо вы также можете указать char * arr [].
В первом случае нам не нужно думать ни о чем сложном. Мы просто знаем, что мы получаем массив char *. Разве мы не знаем этого? Итак, мы получаем его и используем.
Во втором случае это просто, поскольку я объяснил выше, что arr является символом char **, вы можете поместить это как свой тип и получить его безопасно. Теперь система знает тип материала, который мы получили, мы можем получить доступ к следующим элементам, просто используя аннотацию массива. Это похоже на то, что мы получили начальный адрес массива, мы, безусловно, перейдем к следующим элементам, и, как мы знаем, это тип, мы знаем, что он содержит, и как мы можем использовать это дальше. Мы знаем, что он содержит указатель на char, поэтому мы можем законно обращаться к ним.
void func1(char* arr[])
{
//function body
}
void func2(char** arr)
{
//function body
}
int main()
{
//x, y and z are pointer to char
char x[3]={'1', '2', '3'};
char y[3]={'4', '5', '6'};
char z[3]={'7', '8', '9'};
//arr is pointer to char pointer
char* arr[3]={x, y, z};
func1(arr);
func2(arr);
}
Второй параметр никоим образом не отличается в отношении компилятора, то есть 'char * argv []' просто эквивалентен 'char ** argv'. Это больше похоже на вопрос предпочтительного стиля кодирования. –
Возможный дубликат [Что должно быть main() в C и C++?] (Http://stackoverflow.com/questions/204476/what-should-main-return-in-c-and-c) –