指向argv的指针

Ben*_* C. 23 c

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

% ./pointer one two

argv           
+----+          +----+
| .  |   --->   | .  |  ---> "./pointer\0"
+----+          +----+
                | .  |  ---> "one\0"
                +----+
                | .  |  ---> "two\0"
                +----+
Run Code Online (Sandbox Code Playgroud)

从代码:

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

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

我的理解步骤:

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

Dmi*_*tri 18

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

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

(*argv)[1]会提领argv先用*,以获得第一指针char,然后抵消由1 * sizeof(char)字节,然后取消引用得到char.这给出了指向的字符串组的第一个字符串中的第二个字符argv,这显然不是同一个字符argv[1].

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


Jon*_*ler 12

因为argv是指向指针的指针char,所以它argv[1]是指向的指针char.的printf()格式%s需要一个指向char参数和打印字符的参数指向的空终止阵列.由于argv[1]不是空指针,因此没有问题.

(*argv)[1]也是有效的C,但(*argv)相当于argv[0],是一个指针char,所以(*argv)[1]是的第二个字符argv[0],这是/在你的例子.


Ign*_*ams 5

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