char **argv和char *argv[]可以认为基本一样(当然这两者是有些区别的,但大部分情况下可认为是一样的).

我对argv的理解是:argv是一个指向字符串指针的指针。

所以,假设:

char *p = "aaaa";(const char *p)

char **argv = p;

则:

argv = &p(argv存储的值就是p的地址)

*argv = p(argv取值就是p所指向的地址,即&“aaa“,此时,可认为*argv为指针p)

上面等同于:(argv[0]=p)

**argv="aaa"(相当与*p)



现在假设由一个char *p1 = "bbb",若要赋值给p,可这样赋值:

*argv = p1 (因为上面说过,*argv = p = p1,即把p1指向的地址赋值给p,这样相当于p的指向被改变了:从指向"aaa"的地址 转到 指向"bbb"的地址);

注意:因为*argv指向"aaa",p1指向"bbb",若想把*argv指向的内容转换成"bbb",可能有人会这样用:

strcpy(*argv,p1)或者memcpy(*argv,p1,strlen(p1))。

但这样做是错误的,因为上面定义p时:char *p = "aaa",其隐藏的含义是const char *p = "aaa",所以p是指向常量的指针,是不能改变内容的,只能改变其指向。