繁体   English   中英

指向带有argv的指针

[英]Pointer to Pointer with 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] argv偏移sizeof(char *)个字节,然后取消对结果的引用。

(*argv)[1]将解除引用argv先用*以获得所述第一指针char ,然后偏移由1 * sizeof(char)字节,则解除引用为了得到一个char 这给出了argv指向的一组字符串的第一个字符串中的第二个字符,这显然与argv[1]

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM