Char数组指针和“错误:'char []'的初始化方法太多”

时间:2019-06-21 08:51:38

标签: c++

以下代码段给了我错误:“'char []'的初始化程序太多”:

int main()
{
    int input;
    char numbers[] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

    std::cin >> input;

    std::cout << ((input > 9) ? "Greater than 9" : numbers[input-1]) << std::endl;
}

要实现此目的,需要将numbers用作指针变量,即:

char * numbers[] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

我是c ++的新手,我想了解为什么此数组需要为指针,以及内存中到底发生了什么,因此需要将其作为指针?

在其他语言(例如Java)中,您可以执行以下操作:

import java.util.Scanner;

public class Playground
{
    public static void main(String[] args)
    {
        Scanner scanner = new Scanner(System.in);
        int input = scanner.nextInt();

        String[] numbers = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
        System.out.println((input > 9) ? "Greater than 9" : numbers[input-1]);
    }
}

这里不需要指针,根据我的理解,在这种情况下也不需要指针。

3 个答案:

答案 0 :(得分:3)

正如@Max Langhof在评论中所说 char是一个字符。您正在尝试使用字符串数组初始化字符数组

您提到使用C ++,因此使用[]头文件中的std::array而不是使用C样式数组array。连同std::string

std::array<std::string,SIZE> = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

将其声明为指针实际上是创建一个char指针数组,用简单的英语将其转换为char数组数组。

enter image description here

如果您想了解有关C样式char数组的更多信息 The Definitive C++ Book Guide and List

采用以下代码
const char* a [] = {"sadas", "dasdas"}; std::cout << a[0][0]; //将输出's'

a [0]将返回sadas

具有指向char数组的指针将使值const(只读) a[0][0] = 'b' //非法

答案 1 :(得分:3)

由于字符串是文字,即常量,因此您应该这样声明数组:

const char* numbers[] = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };

这是在编译时定义的数组的C方式。因此,数组所需的内存由编译器计算。因此,您必须将其声明为const char *数组,即,在编译时定义的内容不能更改。

您可以这样声明数组:

char numbers[9][6] = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };

这是声明一个9个元素的2D数组,每个元素包含6个字符。因此,现在您可以根据需要在运行时更改每个单词的值。方括号[]起到了很大作用。当您使用char * []时,编译器会将元素视为文字。

如果您事先不知道数组中每个单词的大小,则必须在堆上分配它们。

C ++的方法是使用std:string(为您内部分配在堆上),并且可以在运行时更改它们:

std::string numbers[] = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };

答案 2 :(得分:2)

  

要实现此目的,需要numbers作为指针变量。

您的困惑就在这里(可能还有char的含义)。

numbers不是指针变量,带有或不带有*
*与元素有关,而不是数组。

此:

char numbers[] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

char的数组。它不会编译,因为 char是单个字符,并且表达式"one""two"等都不适合该描述。

相反,它们是字符串文字。它们每个都实现为char的数组(具有讽刺意味的是,您刚刚尝试创建的数组!)。我们通常通过类型为const char*的指针来访问它们(在过去,您可以使用char*,但现在不再适用;也许您使用的是古老的编译器)。

因此,要修复您的数组,它不必是char s的数组,而是const char* s的数组。

这就是您在这里所做的事情({const是我为现代正确性添加的内容):

const char* numbers[] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

...它是const char*的数组。

是的,由于C声明语法令人困惑,因此使用其他答案所示的现代C ++工具无疑是更好的选择。


  

这里不需要指针,根据我的理解,在这种情况下也不需要指针。

这也不是真的,但看起来是因为Java是一种完全不同的语言,具有不同的语法和抽象。

在引擎盖下的某个位置,String 指针(因为Java具有托管对象),此外它的内部还有一个指针指向动态分配的数据(因此,实际上,在Java示例中有 additional 间接!)。

唯一的区别是,它是透明地为您完成的,而不必像在C语言中那样将其拼写出来。

最好不要直接比较两种不相关的语言;这样做通常没有什么价值。