C++程序 中 too many initializers错误是咂回事

程序为
void main()
{
char *name[]={"-s","3","heart_scale","model_1"};

int f_main( 4, **name);
}
另外问一下 char *name[] 和 char **name 区别

问题在于每个字符应该用单引号。字符是指一个符号,例如‘1’,‘@’,‘=’等都是字符。而字符串是多个字符组成的串 例如“1@=”。定义的时候字符需要用单引号,字符串需要用双引号。

用单引号引起的第一个字符实际上代表一个整形数,整数值对应于该字符在编译器采用的字符集中的序列值。 因此,对于采用ASCII字符集的编译器而言,'a'的含义与十进制的97严格一致。

用双引号引起的字符串,代表的却是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制为0的字符'\0'初始化。


扩展资料

在定义一个“字符”的时候,定界符要写成单引号。在屏幕上打印一个字符的时候,需要在printf函数中,使用“%c”这个占位符。在屏幕上要打印一个字符串的时候,在printf函数中,使用的是“%s”这个占位符。与“字符”的“%c”这个占位符是不同的。

字符”占据一个字节,但是“字符串”是占据多个字节。而且,在“字符串”的结尾处,自动被编译器加上了'\0'这个字符,在ASCII码中,'\0'表示的是一个空字符。

如果在定义一个字符串常量的时候,使用了单引号,程序就会报错。在定义字符串的时候,需要在变量名后面加上“中括号”,类似于定义“数组”时候的格式。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-10
第一个问题,只能确定数组没问题,已经试过了

第二个问题,char *name是声明一个指针,指向char类型数据,加上[]变成指针数组,数组的内容都是指向char的指针;而char **name则是指向指针的指针,即有一个指针指向char型,另有一个指针指向存放char指针的地址。

'char [3]' to 'char ** ':你将指向char的指针,赋值给指向指针的指针,类型不一样不能直接赋值。即使要直接赋值,也得在等号右边加上(char **)转换类型追问

你好,那我想实现给**name初始化 该如何实现, **name 第一个指针指向
“-s",第二个指针指向"3",第三个指针指向"heart_scale",第四个指针指向"model_1"};

追答

首先明确一点,对于char *name1[]与char **name2,name1[x]与name2类型是不一样的,而name1与name2类型一样。(数组名是指向数组元素的指针)
name2必须指向一个指针,例如name2=name1,或者name2=&name1[0]。

其次,你要指向name1[x]本身(数组中的元素是指针),还是要指向name1[x]所指向的字符本身?char **name2只能指向指针,例如:name2=&name1[0](等同于name2=name1),此时*name2为name1[0]这个元素,也是指针,而**name2才是字符'-'。此时*(name2+x)即name1[x]。

再次,name2是一个变量,同时只能指向一个东西,要指向不同的,你得声明数组。

本回答被提问者采纳
第2个回答  2012-03-26
too many initializers
直译是:初始化太多
含义:初始化表达式的个数比数组元素数多

定义的时候,char *name1[]={};这个name1的第一维的长度是确定的,不能改变
而char **name2;这个name2的第一维的长度是可变的。
使用起来的时候,name1不能被赋值,即不能使用name1=name2;其它取值运算都可以。
而name2就要自由的多,可以使用name2=name1;取值运算也同样可以。追问

那为何 char **name={"-s","3","heart_scale","model_1"};
这样初始化会出错呢

追答

这样虽然不太好,但还是可以运行的,不信你试试。

追问

不能运行,出现如下错误
D:\C++____libsvm-3.1\shiyan2\main.cpp(15) : error C2440: 'initializing' : cannot convert from 'char [3]' to 'char ** '
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

追答

你说的这个错误根本不在你给出的这段代码里面。。
错误提示是说你把一维数组当做二维数组来使用了。

第3个回答  2012-03-26
规律记好
除了第一维的长度可以由编译器自动计算而不需要指定(只有最左边的一个可以不指定,其他都必须指定长度,如: int a[][2][2] = {1, 2, 3, 4, 5, 6, 7, 8};