Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does char * argv[] means?

I'm new to C programming, I encountered a problem.
In case of complicated declarations i found this

int *daytab[13]; // daytab is an array of 13 pointers to int

which means daytab is the name of the array and the name of the array points to the first element of the array. The array name is not compatible with pointer manipulation like daytab++ etc (correct me if I'm wrong).

But I found this code written in Dennis Ritchie

main(int argc, char * argv[]) {
    while( --argc > 0 )                    
        printf("%s%s",*++argv,(argc>1) > " " : "");

    printf("\n");
    return 0;
}

How can they manipulate argv? Is it not the array name?

like image 507
akash Avatar asked May 21 '13 09:05

akash


3 Answers

The parameter char * argv[] decays to a pointer, char ** argv. You can equally well write the function signature for main() as:

int main(int argc, char ** argv)

You can do what you like with the pointer argv within main(), so argv++ for example just bumps argv to point at argv[1] rather than argv[0].

argv ---> argv[0] ---> "program"
          argv[1] ---> "arg1"
          argv[2] ---> "arg2"
           ...          ...
          argv[argc] == NULL
like image 176
Paul R Avatar answered Oct 19 '22 23:10

Paul R


argv is an array of char*. Doing ++argv means accessing the next cell of the array. The * indicates we want the value of the cell, not the address.

like image 5
ibi0tux Avatar answered Oct 20 '22 00:10

ibi0tux


When a program starts, it gets it's argument in the main function. That's why you ususally write.

int main(int argc, char *argv[])

This simply means that argv is a pointer to as many argument strings as indiciated by argc (== argument count). Since argv decays to char **argv you can also increase it, or you it otherwise like a pointer.

So if you want to print all arguments from the commandline:

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;
}
like image 4
Devolus Avatar answered Oct 19 '22 23:10

Devolus