Они действительно одинаковы.
Золотое правило массивов, которое нужно запомнить:
"Имя массива - указатель на первый элементмассива. "
Итак, если вы объявите следующее:
char text[] = "A string of characters.";
Тогда переменная" text "является указателем напервый символ в массиве символов, который вы только что объявили.Другими словами, «текст» имеет тип char *
.Когда вы обращаетесь к элементу массива, используя [ index ], вы фактически добавляете смещение index к указателю на первый элемент массива, а затемразыменование этого нового указателя.Следовательно, следующие две строки будут инициализировать обе переменные как 't':
char thirdChar = text[3];
char thirdChar2 = *(text+3);
Использование квадратных скобок - это удобство языка, которое делает код намного более читабельным.Но то, как это работает, очень важно, когда вы начинаете думать о более сложных вещах, таких как указатели на указатели.char** argv
совпадает с char* argv[]
, потому что во втором случае «имя массива является указателем на первый элемент в массиве».
Из этого следует такжебыть в состоянии понять, почему индексы массива начинаются с 0. Указатель на первый элемент - это имя переменной массива (снова золотое правило) плюс смещение ... ничего!
У меня были дебатыс моим другом, который лучше использовать здесь.С нотацией char* argv[]
читателю может быть понятнее, что на самом деле это «массив указателей на символы», а не нотация char** argv
, которая может быть прочитана как «указатель на указатель на символ».Мое мнение таково, что эта последняя нотация не передает столько информации читателю.
Хорошо знать, что они точно такие же, но для удобства чтения я думаю, что если намерение представляет собой массив указателейтогда запись char* argv[]
передает это гораздо яснее.