Что означает char * argv []?
Я новичок в программировании на С, я столкнулся с проблемой.
В случае сложных заявлений я нашел это
int *daytab[13]; // daytab is an array of 13 pointers to int
что означает daytab
- это имя массива, а имя массива указывает на первый элемент массива. Имя массива несовместимо с манипуляциями с указателями, такими как daytab++
и т.д. (Исправьте меня, если я ошибаюсь).
Но я нашел этот код, написанный в Dennis Ritchie
main(int argc, char * argv[]) {
while( --argc > 0 )
printf("%s%s",*++argv,(argc>1) > " " : "");
printf("\n");
return 0;
}
Как они могут манипулировать argv
? Это не имя массива?
Ответы
Ответ 1
Параметр char * argv[]
распадается на указатель, char ** argv
. Вы также можете записать подпись функции для main()
как:
int main(int argc, char ** argv)
Вы можете делать то, что вам нравится, с указателем argv
внутри main()
, поэтому argv++
, например, просто bumps argv
, указывать на argv[1]
, а не argv[0]
.
argv ---> argv[0] ---> "program"
argv[1] ---> "arg1"
argv[2] ---> "arg2"
... ...
argv[argc] == NULL
Ответ 2
argv
- это массив из char*
. Выполнение ++argv
означает доступ к следующей ячейке массива. *
указывает, что мы хотим значение ячейки, а не адрес.
Ответ 3
Объявление char *argv[]
представляет собой массив (неопределенного размера) указателей на char
, другими словами массив строк.
И все массивы распадаются на указатели, поэтому вы можете использовать массив как указатель (так же, как вы можете использовать указатель как массив). Таким образом, *++argv
сначала увеличивает "указатель", чтобы указать на следующую запись в массиве argv
(который первый раз в цикле будет первым аргументом командной строки) и разметки, которые указатель.
Ответ 4
Когда программа запускается, она получает аргумент в основной функции. Вот почему вы обычно пишете.
int main(int argc, char *argv[])
Это просто означает, что argv является указателем на столько строк аргументов, как указано аргументом argc (== argument count). Поскольку argv распадается на char ** argv, вы также можете увеличить его, иначе вы иначе как указатель.
Итак, если вы хотите напечатать все аргументы из командной строки:
int main(int argc, char *argv[])
{
for(int i = 0; i < argc; i++)
printf("%s\n", argv[i]);
for(int i = 0; i < argc; i++)
printf("%s\n", argv++);
return 0;
}
Ответ 5
Объявление параметра похоже на объявление массива, но на самом деле (потому что это параметр функции) он не один. C FAQ объясняет это хорошо.
Ответ 6
argc
и argv
- это параметры, передаваемые основной функции программы.
argc
- целое число, содержащее количество параметров, а argv
- указатель на строковый массив, содержащий фактические параметры. Каждый элемент, на который ссылается argv
, разделяется пробелом.
Ответ 7
Что здесь делается, это арифметика указателей.
Указатель на самом деле не изменен.
Указатель указателя используется, временно увеличивается, а затем используется для вывода.
Поскольку оператор ++ помещается перед argv, сначала выполняется его адрес, затем увеличивается, а затем разыменовывается, чтобы получить char * за этим адресом.
Но это не сам адрес, который изменяется, только смещение, откуда будет читаться printf.
Хорошо?