以下代码段给了我错误:“'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]);
}
}
这里不需要指针,根据我的理解,在这种情况下也不需要指针。
答案 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数组数组。
如果您想了解有关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语言中那样将其拼写出来。
最好不要直接比较两种不相关的语言;这样做通常没有什么价值。