Это не всегда. Это значение, которое вы дали программе с помощью операционной системы. Например, при запуске программы с использованием exec
вы можете установить для нее произвольное значение:
int execve(const char *filename, char *const argv[],
char *const envp[]);
Первый параметр - это файл для запуска, и argv будет содержать argv [0] и все остальные параметры для main. envp содержит переменные среды (не определенные стандартом C или C ++. Это вещь posix).
Точнее, это определение argv в C ++:
Реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена. Это должно
иметь тип возвращаемого значения типа int, но в остальном его тип определяется реализацией. Все реализации
допускает оба следующих определения основных:
int main() { /* ... */ }
и
int main(int argc, char* argv[]) { /* ... */ }
В последней форме argc будет количеством аргументов, переданных программе из среды в
который программа запускается. Если argc отлично от нуля, эти аргументы должны быть переданы в argv[0]
через
argv[argc-1]
как указатели на начальные символы многобайтовых строк с нулевым символом в конце (NTMBS)
(17.3.2.1.3.2) и argv[0]
должны быть указателем на начальный символ NTMBS, который представляет
имя, используемое для вызова программы или "". Значение argc должно быть неотрицательным. Значение
argv[argc]
должно быть 0. [Примечание: рекомендуется добавлять любые дополнительные (необязательные) параметры после
ARGV. ]
Это в значительной степени зависит от реализации, которая определяет «имя, используемое для вызова программы». Если вы хотите получить полный путь к исполняемому файлу, вы можете использовать GetModuleFileName в Windows и argv[0]
(для получения имени, используемого для выполнения, может быть относительным) вместе с getcwd
(для получения текущий рабочий каталог, пытаясь сделать имя абсолютным).