C字符串和char数组声明

时间:2012-01-30 19:04:49

标签: c++ c arrays string pointers

鉴于允许这些:

char c[] = "abc";
char c[] = {'a','b','c','\0'}
char *c = "abc";

为什么不允许这样做?

char *c = {'a','b','c','\0'};  // error: a char cannot initialize a char*

如果编译器将字符串文字解释为以字符结尾的字符数组,那么我认为它等同于上面的语句3,不是吗?

同样,为什么不允许这样做:

int arr[3];
int *i = arr; // OK
int *i = {1,2,3} // error: an int cannot initialize an int*

这不是一个大问题,我只是好奇..我猜这个问题归结为字符串文字(或声明的整数数组)和字符元素数组在分配指针时的区别是什么?

3 个答案:

答案 0 :(得分:9)

数组不是指针。使用字符串文字初始化字符数组是一种特殊情况(6.7.8#14):

  

字符类型数组可以由字符串文字初始化,可选地用大括号括起来。字符串文字的连续字符(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。

以及(6.7.8#16):

  

否则,具有聚合或联合类型的对象的初始值设定项应为括号括起的元素或命名成员的初始值设定项列表。

关于指针初始化(6.7.8#11):

  

标量的初始值设定项应为单个表达式,可选择用大括号括起来。对象的初始值是表达式的初始值(转换后);与简单赋值相同的类型约束和转换适用,将标量的类型作为其声明类型的非限定版本。

答案 1 :(得分:0)

数组不是指针。只是数组的名称是指向第一个数组项的指针。

这里要问的是在C / C ++中初始化数组的不同方法。 请注意:

  1. 只能在申报行
  2. 初始化数组
  3. C / C ++中没有字符串类型
  4. 字符数组在C / C ++中用作字符串。
  5. 字符数组的初始化与其他数组的规则相同。
  6. 如果我们定义一个没有显式长度的数组,它将使用初始值的数量长度来定义。
  7. 如果未定义初始值,则项目将是未定义的。这意味着最初不清楚数组项的值。
  8. 如果您有一个数组并为第一个项目分配初始值,则其余项目将为0.
  9. 我稍后会填写此列表; - )

答案 2 :(得分:-2)

字符串文字是section DATA中未命名数据的特例。对于数组,您应该在堆上手动分配空间,并将数据移动到那里。 (一个接一个,因为你不能分配数组。)