首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Char数组指针和"error: char[]“的初始化器太多了

Char数组指针和"error: char[]“的初始化器太多了
EN

Stack Overflow用户
提问于 2019-06-21 08:51:38
回答 3查看 1.7K关注 0票数 2

下面的代码给出了错误:“char[]‘的初始化器太多了”:

代码语言:javascript
复制
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成为指针变量,即:

代码语言:javascript
复制
char * numbers[] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

我是c++的新手,我试图理解为什么这个数组需要是一个指针,以及内存中到底发生了什么,这就要求它是一个指针?

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

代码语言:javascript
复制
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]);
    }
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-21 11:12:56

要做到这一点,需要的是numbers成为指针变量。

您的困惑就在这里(可能还在于char意味着什么)。

numbers 是而不是,它是一个指针变量,有或没有 ***.**。

*是关于元素,而不是数组。

这是:

代码语言:javascript
复制
char numbers[] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

是一个char数组。它不编译,因为a 是一个单一字符,而且没有一个表达式"one""two"等符合这种描述。

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

因此,要修复数组,需要的不是char的数组,而是const char*的数组。

这就是你在这里要做的(const是我为现代正确性添加的):

代码语言:javascript
复制
const char* numbers[] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

…它是一个const char*的数组。

而且,是的,由于C声明语法令人困惑,您可以说最好使用现代C++工具,如其他答案所示。

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

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

在帽子下面的某个地方,String是一个指针(因为Java管理了对象),而且它将有一个指针指向动态分配的数据(因此,实际上,Java示例中还有额外的间接方向!)。

唯一的区别是,它是为你做的,透明的,而不是你必须说出来,因为你在C。

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

票数 2
EN

Stack Overflow用户

发布于 2019-06-21 08:55:06

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

您提到了使用C++,所以[]不使用C样式数组,而是使用array头文件中可用的std::array。和std::string一起

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

将它声明为一个指针,它本质上创建了一个char指针数组,在简单的英语中,这个数组被翻译成一个char数组。

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

取以下代码

const char* a [] = {"sadas", "dasdas"}; std::cout << a[0][0]; // will的输出

A将返回sadas

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

票数 3
EN

Stack Overflow用户

发布于 2019-06-21 09:04:45

由于字符串是文字,即常量,所以应该声明如下所示的数组:

代码语言:javascript
复制
const char* numbers[] = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };

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

可以这样声明数组:

代码语言:javascript
复制
char numbers[9][6] = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };

它所做的是声明一个包含9个元素的2D数组,每个元素包含6个字符。因此,如果您愿意,现在可以在运行时更改每个单词的值。方括号使一切都不同。当您使用char*[]时,编译器将元素视为文本。

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

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

代码语言:javascript
复制
std::string numbers[] = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56699978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档