字符数组初始化的差异

Difference in the initialisation of character array

本文关键字:初始化 数组 字符      更新时间:2023-10-16

我对字符数组进行如下初始化:

  char a[] = "teststring";
  char b[]={'a','a','b','b','a'};

而对于第一个,如果我需要获得字符串长度,我必须执行strlen(a) ....对于另一个字符串,我应该用sizeof(b)/sizeof(b[0])

为什么会有这种差异?

编辑:(I got this)

char name[10]="StudyTonight";   //valid character array initialization
char name[10]={'L','e','s','s','o','n','s',''};    //valid initialization

请记住,当您通过单独列出其所有字符来初始化字符数组时,必须显式地提供''字符。

对于char b,我们必须添加''来进行正确的初始化。

:因此,可以使用以下两种语句中的任何一种,用以空结尾的字符序列初始化名为myword的char元素数组:

char myword[] = { 'H', 'e', 'l', 'l', 'o', '' };
char myword[] = "Hello"; 

字符串字面值,如"teststring"包含双引号之间的字符,加上值为0的终止char。所以

char a[] = "ab";

与;

效果相同
char a[] = {'a', 'b', ''};

strlen()查找值为''的字符。因此,在本例中,strlen(a)将返回2。

相反,sizeof()获得实际使用的内存大小。由于sizeof(char)为1,根据标准中的定义,这意味着sizeof(a)给出了3的值-它计算了'a', 'b'''

a是c风格的字符串,即以空结尾的字符数组。初始化相当于:

char a[] = {'t','e','s','t','s','t','r','i','n','g',''};

b,然而,不是null终止,所以它不是一个c风格的字符串,你不能使用像std::strlen()这样的函数,因为它们只对c风格的字符串有效。

字符串字量扩展为字符数组,但也包括结束的零字符。所以想想

char a[] = "teststring";

如果你有这个类型

char a[] = {'t','e','s','t','s','t','r','i','n','g',''};

经验法则

在char数组上使用 strlen() 时,使用字符串字面值 its进行初始化。strlen函数可以被认为是一个简单的扫描,结束零字符()计算所需的迭代。

关于sizeof

即使有时与括号一起使用,sizeof也是一个运算符,是c++语言的一个完整部分(继承自C times)。在char c[] = "hello";这样的情况下,sizeof(c)将返回6,这正好比strlen(c)多1,您可能会想:"让我们跳过对终止符的低效扫描",但是sizeof一旦在指针上工作就会停止这种"高效",并且数组可以(并且将)在需要时用作指针。看下面的例子:

#include <iostream>
// naive approach, don't do that
int myarraysize(char s[]) 
{
    return sizeof(s);
}
int main () 
{
    char c[] = "hello";
    std::cout << sizeof(c) << " vs " << myarraysize(c) << std::endl;
    return 0;
}

在线演示

你可以写

char b[]={'a','a','b','b','a',''};

克服"差异"

还要注意

 sizeof(b)/sizeof(b[0])

本质上归结为

 sizeof(b)

,因为sizeof(char)总是1。您的公式用于任何其他数组元素类型。