Я собираюсь ответить на ваш вопрос косвенно, потому что я думаю, что в root вам нужно понять разницу между массивом и указателем.
C может сбить с толку новичков, поскольку он использует тот же синтаксис для указателей и массивов. В массиве он определяет пространство для всех своих элементов, а a[n]
возвращает элемент n
. Если a
является указателем, он определяет пространство только для указателя, а a[n]
относится к n
-ому местоположению, начинающемуся везде, где указывает a
. Если a
является массивом, вы все равно можете использовать синтаксис указателя *(a + n)
для ссылки на a[n]
. В этом отношении n[a]
получает вам то же самое.
С опытом синтаксис удобен. Для студента, как я уже сказал, использование одинакового синтаксиса для двух понятий может сбивать с толку.
Обе концепции появляются в argv
в вашей main
процедуре:
int main( int argc, char *argv[] )
Что такое argv
? А что такое argv[0]
?
argv
не является строкой. Это массив. Массив чего? Каждый элемент (включая первый, конечно) является char *
, указателем на символ. До одного символа. Как это случается, за этим символом может следовать другой, и другой, в ... строке ... до символа NUL, обозначающего конец.
Каждый элемент в argv
имеет фиксированный размер: sizeof(char*)
. Длина argv
определяется как argc
. Длина каждой строки, на которую указывает каждый элемент, неизвестна во время компиляции; это зависит от того, какие аргументы передаются вашей программе, когда она вызывается.
Имея в виду argv
, вы поймете, что ваше определение, char* array[3][10]
, легче для понимания. Вы также объявили массив char *
. То, что вы еще не сделали, - это то, что делает ОС, когда она вызывает main
: определите что-то, на что они могут указать, и присвойте их адреса указателям.
При работе с указателями всегда спрашивайте, на что он указывает ? Где указателю было присвоено значение и как эта память была выделена (stati c, dynamici c или automati c)? Если вы не уверены, это лишь вопрос времени, когда система напомнит вам, что она тоже не знает.