char *argv[]
— это указатель, на который распался массив char *
. Например, вызов такой команды:
$ ./command --option1 -opt2 input_file
можно рассматривать как:
char *argv[] = {
"./command",
"--option1",
"-opt2",
"input_file",
NULL,
};
main(4, argv);
Таким образом, в основном существует массив строк за пределами main
, и он передается вам в main
:
char *argv[]
\- --/ ^
V |
| It was an array
|
of strings
Причина, по которой argv[0]
является командой вызова, в значительной степени историческая. Не знаю, о чем думал первый человек, который до этого додумался, но могу назвать по крайней мере одну полезность для него.
Представьте себе программу, например vim
или gawk
. Эти программы могут устанавливать символические ссылки (например, vi
или awk
), которые указывают на одну и ту же программу. Таким образом, запуск vim
или vi
(или аналогично gawk
или awk
) может выполнять одну и ту же программу. Однако, проверяя argv[0]
, эти программы могут определить, как они были вызваны, и, возможно, внести соответствующие коррективы.
Насколько мне известно, ни одна из упомянутых выше программ на самом деле этого не делает, но могла бы. Например, vim
, вызываемый через символическую ссылку с именем vi
, может включить некоторую совместимость. Или gawk
, называемый awk
, может отключить некоторые расширения GNU. Однако в современном мире, если бы они хотели это сделать, они, вероятно, создали бы скрипты, которые дают правильные варианты.
person
Shahbaz
schedule
12.02.2014
char *
представляет строку в стиле C, тоchar *x[]
означает, чтоx
представляет собой массив строк в стиле C. - person Brandin   schedule 12.02.2014i=0
, затем попробуйте вызвать свою команду из оболочки разными способами, например../foo bar baz
или/path/to/foo bar baz
и срок действия, чтобы увидеть, есть ли разница в том, как ваша среда передает argv[0] - person Brandin   schedule 12.02.2014char *x[]
является объявлением параметра, это означает, чтоx
является указателем на указатель наchar
. Он может указывать или не указывать на элемент массиваchar*
указателей, и этиchar*
указатели могут указывать или не указывать на строки в стиле C; в объявлении параметра это не указано. - person Keith Thompson   schedule 12.02.2014char **x
. Да.char *
не подразумевает автоматически строку в стиле C. Кроме того, интересно отметить, что определение строк в стиле C не обеспечивает надежного способа проверки того, является ли что-либо строкой. Не уверен, что это в стандарте C или POSIX, но я думаю, что где-то указано, что в особом случаеargv
это должно содержать массив строк в стиле C, последний элемент которого имеет значение(char *)0
в соответствующих реализациях - person Brandin   schedule 12.02.2014