【问题标题】:C argv pointer typeC argv 指针类型
【发布时间】:2014-09-20 17:50:52
【问题描述】:

我对如何使用指针来让这段代码工作感到困惑:

#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]

【问题讨论】:

  • 您必须使用 char* test = argv[1];.argv[1][0] 是类型 char 并且您已将其分配给 char * 这导致您出现问题。
  • 要打印出char,您应使用%c%s ist 打印出0-终止的char 数组又名“字符串”。

标签: c++ c pointers argv


【解决方案1】:

argv[1][0] 的类型是char

argv[1] 的类型是char*

你需要使用:

char* test = argv[1];

如果你调用你的程序:

program "First Arguent" "Second Argument"

那么,在main 中,argc 等于3

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];

【讨论】:

  • 通常值得考虑表达式的含义,而不仅仅是它们的类型。在这种情况下,当然,类型有助于将您带到那里。但既然我们在教,两者都应该探索。
  • 这太好了,我想从 arv[1] 中取出第一个字符,所以我只是偶然使用 char* 而不是 char。谢谢!
  • @LightnessRacesinOrbit,感谢您帮助改进答案。
【解决方案2】:

第一个参数是argv[1]argv[1][0] 是该参数的第一个字符。把代码改成

char* test = argv[1];

【讨论】:

    【解决方案3】:

    char *argv[] 是一个指针数组,每个指针指向一个字符数组(以空结尾)。假设您将“Hello World”作为命令行参数传递给程序。字符串(以空字符结尾的字符数组)的基地址存储在 argv[1] 中。由于 argv[1] 指向一个字符串,因此 argv[1][0] 给出了第 0 位的字符
    字符串中的索引。

    现在考虑你的任务:

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

    这里使用 argv[1][0],实际上是在
    argv[1],并将存储在字符串第 0 个索引处的字符分配给测试
    指针。由于“test”是一个指针,因此它必须存储地址而不是值。
    上面的赋值分配了一个字符值来测试,并且由于字符是
    在 C 中内部表示为整数,因此您会收到一条警告:

        incompatible integer to pointer conversion initializing
    

    这里的整数值是指argv[1][0],指针是test。

    上面的赋值可以用作:

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

    相当于:

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

    只要赋值1中的索引为0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 2018-04-05
      • 2012-05-09
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多