Если у меня есть это:
int main(int argc, char *argv[])
В теле вы можете иногда находить программы, используя argv[1].
Когда мы используем argv[1] над argv[0]? Это только когда мы просто хотим прочитать второй аргумент в командной строке?
Если у меня есть это:
int main(int argc, char *argv[])
В теле вы можете иногда находить программы, используя argv[1].
Когда мы используем argv[1] над argv[0]? Это только когда мы просто хотим прочитать второй аргумент в командной строке?
  По соглашению, argv[0] - это текущее имя  текущей программы (или путь), а argv[1] через argv[argc - 1] - аргументы командной строки , который предоставляет пользователь.
Однако это не должно быть правдой - программы могут выполнять функции, специфичные для ОС, чтобы обойти это требование, и это происходит достаточно часто, чтобы вы знали об этом. (Я не уверен, если вы можете многое сделать, даже если знаете об этом, хотя...)
Пример:
gcc -O3 -o temp.o "My file.c"
будет (должен) выводить следующие аргументы:
argc: 5
argv: ["gcc", "-O3", "-o", "temp.o", "My file.c"]
Таким образом, argv[0] будет ссылаться на gcc, а не на -O3.
 argv - это массив указателей, и каждый указатель в этом массиве сохраняет один аргумент из командной строки. Итак, argv[0] - это первый аргумент (то есть сам исполняемый файл/программа), argv[1] - второй аргумент и т.д.!
Общее количество аргументов определяется argc.
Предположим, что ваш исполняемый файл С++:
 /home/user/program (или C:\program.exe в Windows)
если вы выполните:
 ./home/user/program 1 2 (или C:\program.exe 1 2 в Windows)
 argv[0] = /home/user/program (C:\program.exe) argv[1] = 1 argv[2] = 2
Это потому, что:
argv[0] - это путь к исполняемому файлуargv[1] является первым аргументомEdit:
Теперь я вижу, что argv[0] не обязательно путь исполняемого файла. 
Прочтите следующий вопрос SO: Является ли args [0] гарантией того, что это путь выполнения?
argv [0] - путь выполнения программы, argv [1] - первый параметр для программы
Да, в основном это, argv[1] - второй параметр командной строки. Первый параметр командной строки - это имя самой программы.
В качестве альтернативы, чтобы избежать семантического беспорядка, который первоначально был у этого ответа, и комментариев от других, может иметь смысл вызвать argv [0] нулевой параметр, так что argv[1] теперь будет "первым" из пользовательские значения.
В любом случае это происходит из семейства функций exec(), например. execl, который имеет использование:
 int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
В оболочке (Unix) при вводе команды, при необходимости оболочка сначала разрешает имя команды (используя $PATH), чтобы найти реальный абсолютный путь. Путь (абсолютный или относительный) предоставляется для path, а команда, как первоначально введенная, предоставляется как arg0, со временем становясь argv[0] в вашей программе.
Остальные параметры командной строки заканчиваются как argv[1] и т.д.
Короткий ответ - да, массив содержит все параметры, переданные в программу.
как argv [0] - путь к файлу самой программы. Дополнительные параметры командной строки находятся в дополнительных индексах, argv [1], argv [2]. Вы можете прочитать больше здесь: http://www.site.uottawa.ca/~lucia/courses/2131-05/labs/Lab3/CommandLineArguments.html