2011-10-03 65 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)