繁体   English   中英

C字符串和char数组声明

[英]C string and char array declarations

鉴于这些是允许的:

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*

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

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

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

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

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

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

并且(6.7.8#16):

否则,具有聚合或联合类型的对象的初始化程序应为括号内的元素或命名成员的初始化程序列表。

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

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

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

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

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

字符串文字是section DATA中未命名数据的特例。 使用数组时,您应该手动分配堆上的空间,然后将数据移到那里。 (因为不能分配数组,所以是一对一的。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM