C 中 char[] 和字符串的区别

Difference between char[] and strings in C

C编程语言通过使用引号来区分字符常量和字符串常量,方式如下:

'c'是字符c,而"c"是由单个字符c组成的长度为1的字符串。

为什么要这样区分?它有什么用? 这与 C++ 有何不同?

你说错了

while "c" is a string of length 1 consisting of the single character c

"c"是由两个字符组成的字符数组,具有静态存储时长。你可以想象它的定义如下

char s[] = { 'c', '[=10=]' };

标准 C 函数 strlen 通过搜索终止零并计算终止零之前的字符数来确定字符串文字的长度。

如果字符串文字的定义类似于 "",则它只能包含一个字符(以零结尾)。对于此 "empty" 字符串文字函数 strlen 将 return 值 0.

字符整型常量或所谓的字符文字的类型为 int。它们不是与字符串文字相反的字符数组。甚至像 'AB' 这样的多字节字符常量也会被转换为 int 类型的对象,并且这种转换是实现定义的。 (在 C++ 中,由一个字符组成的字符文字的类型为 char,例如 sizeof( 'A' ) 等于 1,而多字节字符文字的类型为 int,与 C 中的方式相同)

由于字符文字的类型为 int,因此它们的大小是固定的,等于 sizeof( int ).

比较此语句的输出

printf( "%zu\n", sizeof( 'A' ) );
printf( "%zu\n", sizeof( 'AB' ) );
printf( "%zu\n", sizeof( "A" ) );
printf( "%zu\n", sizeof( "AB" ) );

如果sizeof( int )等于4那么你会得到

4
4
2
3

注意:编译器可以为语句

发出警告或错误
printf( "%zu\n", sizeof( 'AB' ) );

使用 'c' 会告诉编译器你想要一个单一的字符,而使用 "c" 会创建一个空终止字符串(与说 {'c', '[=12=]'} 相同),例如如果你想要一个没有零终止符的固定字符数组来结束您将使用带单引号的字符数组,但是如果您想要一个以零终止的字符数组 - 因此适合在 strlen(), [= 中使用14=] 和其他你会使用双引号。

这是他们做出的设计决定。 "c" 是 'c' + '\0' 而 'c' 只是 'c'。大多数字符串操作函数将基于尾随的 '\0'

因为您试图将它与 python 联系起来。在python中,一切都是对象。当您在 python 中创建字符串时,此对象还会存储字符串长度以及字符串的字符。所有字符串方法都将使用字符串对象中存在的长度信息。字符只是 python.

中长度为 1 的字符串

由于 C 是一种非常古老的系统编程语言,它应该在内存非常低的设备上工作,因此他们无法为他们创建的每个字符串创建一个具有长度和其他内容的对象。这是一种内存浪费。相反,他们使用一个尾随的 '\0' 字符来表示字符串

C 是[相对]低级静态类型编程语言。

char c = 'c';
const char* s = "s";

上面的语句不仅字面常量的值不同(c:单字节存储;s:两字节存储+4/8字节指针),而且变量的类型也不同(c:单字节,某些算术操作;s:4/8 字节指针,不同的算术)。

我向你断定,后者的区别更为重要;文字常量是为了让变量、函数参数、结构成员等更容易使用。

此外,用 C 解决的典型问题都是低级性质的,您对单个字符和字符串之间的逻辑差异感兴趣。比如gpio,串口,子串搜索算法。

[当然 C 也用于其他领域,在 glibenlightenment 等更高级别的项目中,您不太可能看到太多字符与字符串的区别。]

Python是一种高级动态语言。

c = 'c'
s = "s"

在上面的语句中 locals/labels cs 指向对象和类型是在运行时动态确定的。因此根本不需要 "character" 和 "string" 之间的区别。

Python 中解决的问题通常级别更高,通常您会处理 JSON blob、HTTP 请求、数据库查询、虚拟机等;即使您需要处理单个字符,长度为 1 的字符串也是可以接受的近似值。

[如果您使用 numpycffi,您会担心字符和字符串的存储,而这些模块提供了这样做的机制。]