void f2(int argv[3]) { //here argv is a variable containing an address //argv[0] == *argv; //I can also say ++argv; } void f3(int *argv) void f () { char argv[3]; //argv==&argv[0]. can't assign to this argv. //char *argv; /argv is a place containing an address. can even assign to it. f2(argv); //the address, so far not stored anywhere, is copied into f2's var } ---- conclusion: Inside a function, a local variable char x[] is different from char *x, which can also be assigned to. In a function signature, the only thing is char *x. char x[] is only for documentation purposes. It tells you that besides x, x+n is also possibly a valid pointer. int main(int argc, char **argv) { }