user-0 提问: C语言：int a2[10]="123"; 这种定义是非法的吗？为什么？

回复:
user: user-1
content: 类型不一致

user: user-2
content: 数组的初始化列表是 ｛｝; 串的字面值，只能初始化  字符指针和字符数组  如果用它初始化整型数据，你认为哪种好啊  int  a[20] ="abcdefgh" 初始化为 ｛'abcd','efgh','ijkl',0｝;还是 ｛'a’，‘b’，‘c，’‘d','e’，‘f’’，g‘，‘h'｝

user: user-3
content: int a1[10]={'1','2','3'};   //为什么这样定义可以----->这样是给int类型的数组的每个成员赋字符'1','2','3'； int a2[10]="123";           //为什么这样定义就不行了？----->这句表示把字符串"123" 的地址赋给int指针地址a2，                                           //指针要区分类型，所以不可以这样赋值； char d[10]={1,2,3};     //为什么这样可以？----->这句是给字符串数组每个成员赋整数值1,2,3；

user: user-4
content: char a1[10] = "123";                    // 初始化字符串为 "123" char a2[10] = { "123" };                // 初始化字符串为 "123" char a3[10] = { 1, 2, 3, 0 }; char a4[10] = { '1', '2', '3', '\0' };  // 初始化字符串为 "123"  int b1[10] = { 1, 2, 3, 0 }; int b2[10] = { '1', '2', '3', '\0' };

user: user-5
content: 引用 楼主 weishen2011 的回复:#include <stdio.h> #include <stdlib.h>  int main() {     int b='A';     char c=65;     printf("%d %c %d %c\n",b,b+48,c,c);          //以上条语句，说明char变量和int是可以通用的      int a1[10]={'1','2','3'};   //为什么这样定义可以     printf("%d %d %d\n",a1[0],a1[1],a1[2]);     int a2[10]="123";           //为什么这样定义就不行了？  char d[10]={1,2,3};     //为什么这样可以？     printf("%c %c %c\n",d[0],d[1],d[2]);      return 0; }  我们知道，C语言中，char变量和int变量是通用的 单个字符和单个整数怎么定义都行，这个应该是没问题的 那么问题来了： 对于字符串（数组）和整型数组：     int a1[10]={'1','2','3'};   //为什么这样定义可以     int a2[10]="123";           //为什么这样定义就不行了？     char d[10]={1,2,3};     //为什么这样可以？ 能一一解释一下吗？亿分感谢！！ int a2[10]="123";           //为什么这样定义就不行了？  报错是：array of inappropriate type initialized from string constant 大意是：初始化时给字符串常量定义数组类型不恰当 貌似这里只能用char去修饰…… 不知道怎么解释好？  语法中有一个特例 char a[10]="123"是可以的，这是将字符数组用字符串初始化，最后追加一个结束符，也就是初始化字符串的意思，但是这只是语法上的一个标准规定许可的特例，如果你不是字符数组当然不行(无法执行隐式转换)，但是，你可以加上大括号变成 int a[10]={'1','2','3'}

user: user-6
content: 看语法    An array of character type may be initialized by a character string literal, optionally enclosed in braces.  Successive characters of the character string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the members of the array.  3.5.7 Initialization  Syntax            initializer:                   assignment-expression                   {  initializer-list }                    {  initializer-list , }            initializer-list:                   initializer                   initializer-list ,  initializer

user: user-7
content: 变量类型都不一样，当然会报错了

user: user-8
content: 引用 6 楼 weishen2011 的回复:[quote=引用 5 楼 q3733353520 的回复:] [quote=引用 3 楼 weishen2011 的回复:] [quote=引用 2 楼 q3733353520 的回复:]  char a[10] = {"123"};//这样是可以的，数组在定义的时候初始化可能要括起来，我猜测 //数据类型之间是可以强制转化的   没有啊，char 定义字符数组的时候可以需要花括号的 现在就是为啥int a[100]="123这种定义，为什么不行 没有一个太好的解释[/quote] 其实你那些编译得过的说明是可以隐式转化的，而 int a[100]="123";是因为这个表达式的赋值对象其实是数组a的成员(如a[0],a[1])而"123"它其实是表示"123"的首地址，是个指针值，char *指针类型是不能够cast成int类型的 所以报错  cast from pointer to integer of different size [-Wpointer-to-int-cast]    [/quote] 没看懂你说的意思…… 怎么变成char指针了[/quote]  "123"这个表达式的值就是个char类型的指针

user: user-9
content: 问题1： int a1[10]={'1','2','3'};   //为什么这样定义可以    问题2：  int a2[10]="123";           //为什么这样定义就不行了？    问题3：  char d[10]={1,2,3};     //为什么这样可以？  C语言中，char变量和int变量是通用的,即ASCII编码与十进制之间的转换。问题3和问题1应该原理相似。 问题1: 等价于 int ch1='1',ch2='2',ch3='3';即原数组各个元素赋值。  问题2: 数组的首地址指向字符串常量"123" 。

user: user-10
content: int arr[10] = "123"; //"123" 是字符串啊！ int arr[10] = {'1', '2', '3'}; //相当于 int arr[10] = {49, 50, 51} ; 因为char 和 int 可以转换

user: user-11
content: array of inappropriate type initialized from string constant 的意思就是 不恰当类型的数组从字符串常量初始化   int a[10]="123"; “123”赋给a[10]的是地址，

user: user-0
content: 引用 1 楼 FXM720505 的回复:数组定义  赋值时需要用大括号包起来 字符数组可以不要花括号的

user: user-0
content: 引用 2 楼 q3733353520 的回复: char a[10] = {"123"};//这样是可以的，数组在定义的时候初始化可能要括起来，我猜测 //数据类型之间是可以强制转化的   没有啊，char 定义字符数组的时候可以需要花括号的 现在就是为啥int a[100]="123这种定义，为什么不行 没有一个太好的解释

user: user-8
content: char a[10] = {"123"};//这样是可以的，数组在定义的时候初始化可能要括起来，我猜测 //数据类型之间是可以强制转化的

user: user-12
content: 数组定义  赋值时需要用大括号包起来

user: user-13
content: 1. 自动类型转换 char -> int 2. 指针是带类型的

user: user-0
content: 引用 5 楼 q3733353520 的回复:[quote=引用 3 楼 weishen2011 的回复:] [quote=引用 2 楼 q3733353520 的回复:]  char a[10] = {"123"};//这样是可以的，数组在定义的时候初始化可能要括起来，我猜测 //数据类型之间是可以强制转化的   没有啊，char 定义字符数组的时候可以需要花括号的 现在就是为啥int a[100]="123这种定义，为什么不行 没有一个太好的解释[/quote] 其实你那些编译得过的说明是可以隐式转化的，而 int a[100]="123";是因为这个表达式的赋值对象其实是数组a的成员(如a[0],a[1])而"123"它其实是表示"123"的首地址，是个指针值，char *指针类型是不能够cast成int类型的 所以报错  cast from pointer to integer of different size [-Wpointer-to-int-cast]    [/quote] 没看懂你说的意思…… 怎么变成char指针了

user: user-8
content: 引用 3 楼 weishen2011 的回复:[quote=引用 2 楼 q3733353520 的回复:]  char a[10] = {"123"};//这样是可以的，数组在定义的时候初始化可能要括起来，我猜测 //数据类型之间是可以强制转化的   没有啊，char 定义字符数组的时候可以需要花括号的 现在就是为啥int a[100]="123这种定义，为什么不行 没有一个太好的解释[/quote] 其实你那些编译得过的说明是可以隐式转化的，而 int a[100]="123";是因为这个表达式的赋值对象其实是数组a的成员(如a[0],a[1])而"123"它其实是表示"123"的首地址，是个指针值，char *指针类型是不能够cast成int类型的 所以报错  cast from pointer to integer of different size [-Wpointer-to-int-cast]