指向argv的指针

基于我对指向字符数组的指针的理解,

% ./pointer one two argv +----+ +----+ | . | ---> | . | ---> "./pointer\0" +----+ +----+ | . | ---> "one\0" +----+ | . | ---> "two\0" +----+ 

从代码:

 int main(int argc, char **argv) { printf("Value of argv[1]: %s", argv[1]); } 

我的问题是,为什么argv [1]可以接受? 为什么它不像(* argv)[1]?

我的理解步骤:

  1. 拿argv,取消引用它。
  2. 它应该返回指向字符的指针数组的地址。
  3. 使用指针算术来访问数组的元素。

[]视为指针而不是数组的运算符更方便; 它与两者一起使用,但由于数组衰减到指针数组索引仍然有意义,如果以这种方式看。 所以基本上它偏移,然后解除引用,指针。

所以使用argv[1] ,你真正得到的是*(argv + 1)用更方便的语法表达。 这为argv指向的内存块提供了第二个char * ,因为char *argv指向的类型, [1]通过sizeof(char *)字节偏移argv然后取消引用结果。

(*argv)[1]首先使用*取消引用argv以获取第一个指向char指针,然后将其偏移1 * sizeof(char)字节,然后取消引用以获取char 。 这给出了argv指向的字符串组的第一个字符串中的第二个字符,这显然与argv[1]

因此,将索引数组变量视为由“偏移然后取消引用指针”运算符操作的指针。

因为argv是指向char指针,所以argv[1]是指向char的指针。 print()格式%s需要一个指向char参数的指针,并打印参数指向的以null结尾的字符数组。 由于argv[1]不是空指针,因此没有问题。

(*argv)[1]也是有效的C,但是(*argv)等价于argv[0]并且是指向char的指针,因此(*argv)[1]argv[0]的第二个字符,是/在你的例子中。

将指针索引为数组会隐式取消引用它。 p[0]*pp[1]*(p + 1)等。