>>29699 Запоздало обьясняю как работает передача аргументов для C.
К примеру, ты вызываешь программку
foo
, кормя ей параметры bar и baz, вот так:
$ foo bar baz
В
main
программки
foo
они приходят как
int argc
и
char** argv
. Второе — указатель на первый элемент массива из указателей на массивы из
char
ов a.k.a. строк, являющихся именем программы и аргументами для неё, тоесть, в данном случае
"foo"
,
"bar"
и
"baz"
. Первое — количество указателей в этом массиве. Где и куда кладутся эти массивы — на стек, в кучу, в специальную область памяти специально отведённую для того чтоб ложить туда аргументы или ещё куда-нибудь — C на это плевать, главное чтоб на эти строки были указатели, указатели были собраны в массив в том же порядке, в котором они были написаны, указатель на этот массив был отправлен в
argv
главной функции, а количество строк — в её argc.
Отвечая на нумерованные вопросы:
1) Нет, хуже — передаётся указатель на массив из
argc
указателей на null-terminated строки.
2) Никакой, только вышеописанные указатели и сами массивы.
3) В глубинах операционной системы.
4)
char first[] = "first string";
char second[] = "second string";
char third[] = "third string";
char* array_of_strings[3] = { first, second, third };
Заметь в коде выше, что когда ты в Сях передаёшь массив, на самом деле ты передаёшь только указатель на него. Тоесть, тип переменных
first
,
second
и
third
везде, где ты напишешь их имя —
char*
, а тип array
ofstrings —
char**
, не смотря на то, что обьявлены они массивами и массивом из указателей на массивы.
> > 29705
Для действительно серьёзных проектов, работающих с большими строками используются корды, см.
enwiki://Rope_(data_structure)