2014-09-20 35 views
1

我很困惑,如何使用指針來獲得此代碼工作:çargv的指針類型

#include<stdio.h> 

int main(int argc, char *argv[]){ 

    char* test = argv[1][0]; 
    printf("hello %s\n", test); 
} 

以下是錯誤:

incompatible integer to pointer conversion initializing 
    'char *' with an expression of type 'char'; take the address with & 
    [-Wint-conversion] 
+2

你必須使用像'char * test = argv [1];'.'argv [1] [0]'是'char'類型,並且您已將它分配給'char *',這會導致您發出問題。 – 2014-09-20 07:08:55

+0

爲了打印'char',你應該使用'%c'。 '%s' ist可以打印一個'0'結尾的'char'數組,也就是「字符串」。 – alk 2014-09-20 07:18:51

回答

8

類型的argv[1][0]char

argv[1]的類型是char*

您需要使用:

program "First Arguent" "Second Argument" 

然後,在mainargc等於3

char* test = argv[1]; 

如果你調用程序。

argv[0] = "program" 
argv[1] = "First Arguent" 
argv[2] = "Second Arguent" 
argv[3] = NULL 

鑑於這樣的情況下,

argv[1][0]評估爲的argv[1]第一個字符,它等於'F'

如果這是你想獲得什麼,你可以使用:

char test = argv[1][0]; 

如果你想獲得整個第一個參數,那麼你需要使用:

char* test = argv[1]; 
+0

通常值得考慮表達式的_meaning_,而不僅僅是它們的類型。當然,在這種情況下,這種類型可以幫助你到達那裏。但是既然我們在教學,兩者都應該被探索。 – 2014-09-20 07:12:49

+0

這是非常好的我想獲得arv的第一個字符[1],所以我只是使用char *而不是字符來發生意外。謝謝! – 2014-09-20 07:16:36

+1

@LightnessRacesinOrbit,感謝您幫助更好地回答問題。 – 2014-09-20 07:21:15

6

第一個參數是argv[1],和argv[1][0]該參數的第一個字符。更改代碼以

char* test = argv[1]; 
1

的char * argv的[]是一個指針數組,每個指針指向一個字符數組(空終止)。假設你將「Hello World」作爲命令行參數傳遞給你的程序。字符串的基地址(以空字符結尾的字符數組)存儲在argv [1]中。由於argv [1]指向一個字符串,因此argv [1] [0]給出字符串中第0個
索引處的字符。

現在考慮您的任務:使用的argv [1] [0],你實際上是索引字符串裏面指向的
的argv [1],並分配存儲charcater

char* test = argv[1][0]; 

這裏指向字符串的第0個索引
指針。由於「test」是一個指針,所以它必須存儲地址而不是值。
上述分配分配一個字符值來測試,並且由於字符
內部表示爲用C整數,因此你得到,指出一個警告:

incompatible integer to pointer conversion initializing 

這裏將整數值是指ARGV [ 1] [0],指針正在測試。

上述分配可以用作:

char *test = &argv[1][0]; // assignment 1 

這相當於:

char *test = argv[1]; // assignment 2 

只要在分配索引1爲0