2011-10-03 69 views
18

基于我的指针的理解的指针的字符数组,指向指针与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. 使用指针运算来访问数组的元素。
+3

+1为图。 :) – Mysticial

回答

14

它更方便,想[]为指针,而不是数组的操作;它与两者一起使用,但由于数组衰减到指针数组索引仍然是有道理的,如果这样看。所以本质上它抵消了,然后解除引用,一个指针。

因此,与argv[1],你真正得到的是*(argv + 1)用更方便的语法表示。这给你第char *argv指向的内存块,因为char *是类型argv指向,和[1]偏移argv通过sizeof(char *)字节然后解引用结果。

(*argv)[1]将间接引用argv先用*拿到第一指针char,然后抵消由1 * sizeof(char)字节,则取消引用得到char。这给出argv指向的字符串组的第一个字符串中的第二个字符,这显然与argv[1]不同。

因此,想象一个索引数组变量作为一个指针被一个“偏移然后解引用一个指针”操作符操作。

+0

是的,我有混淆为什么我们不需要derefrence argv,但事实证明,我忘记了它等于*(argv + n),其中n是索引下标。 –

10

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

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

4

将指针索引为数组隐式地解引用它。 p[0]*pp[1]*(p + 1)