下面的代码给出了错误:“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]);
}
}这里不需要指针,据我理解,在这种情况下也不需要指针。
发布于 2019-06-21 11:12:56
要做到这一点,需要的是
numbers成为指针变量。
您的困惑就在这里(可能还在于char意味着什么)。
numbers 是而不是,它是一个指针变量,有或没有 ***.**。
*是关于元素,而不是数组。
这是:
char numbers[] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};是一个char数组。它不编译,因为a 是一个单一字符,而且没有一个表达式"one"、"two"等符合这种描述。
相反,它们是字符串文本。这些都是作为char数组实现的(具有讽刺意味的是,您刚刚尝试创建的那种数组!)我们通常通过const char*类型的指针访问它们(在过去您可以使用char*,但这不再是真的;也许您使用的是一个古老的编译器)。
因此,要修复数组,需要的不是char的数组,而是const char*的数组。
这就是你在这里要做的(const是我为现代正确性添加的):
const char* numbers[] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};…它是一个const char*的数组。
而且,是的,由于C声明语法令人困惑,您可以说最好使用现代C++工具,如其他答案所示。
这里不需要指针,据我理解,在这种情况下也不需要指针。
这也不是真的,但看起来是因为Java是一种完全不同的语言,具有不同的语法和抽象。
在帽子下面的某个地方,String是一个指针(因为Java管理了对象),而且它将有一个指针指向动态分配的数据(因此,实际上,Java示例中还有额外的间接方向!)。
唯一的区别是,它是为你做的,透明的,而不是你必须说出来,因为你在C。
最好不要直接比较两种无关的语言;这样做通常没有什么价值。
发布于 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' //成为非法
发布于 2019-06-21 09:04:45
由于字符串是文字,即常量,所以应该声明如下所示的数组:
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" };https://stackoverflow.com/questions/56699978
复制相似问题