2014-09-20 34 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