Что означает 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.

Хорошо?