C中字符[]和字符串之间的差异

C中字符[]和字符串之间的差异,c,string,char,C,String,Char,C编程语言通过以下方式使用引号区分字符常量和字符串常量: 'c'是字符c,而“c”是由单个字符c组成的长度为1的字符串 为什么会有这种区别?它有什么用处? 这和C++有什么不同? < p>你错了说 而“c”是由单个字符c组成的长度为1的字符串 “c”是一个字符数组,由两个具有静态存储持续时间的字符组成。你可以想象它的定义如下 char s[] = { 'c', '\0' }; 标准C函数strlen通过搜索终止零并计算终止零之前的字符数来确定字符串文字的长度 如果字符串文本的定义类似于”,则它

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

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

为什么会有这种区别?它有什么用处?
这和C++有什么不同?

< p>你错了说

而“c”是由单个字符c组成的长度为1的字符串

“c”是一个字符数组,由两个具有静态存储持续时间的字符组成。你可以想象它的定义如下

char s[] = { 'c', '\0' };
标准C函数
strlen
通过搜索终止零并计算终止零之前的字符数来确定字符串文字的长度

如果字符串文本的定义类似于
,则它只能包含一个字符(以零结尾)。对于这个“空”字符串文本函数,
strlen
将返回值0

字符整数常量或所谓的字符文字的类型为
int
。它们不是与字符串文字相对的字符数组。甚至像
'AB'
这样的多字节字符常量也被转换为
int
类型的对象,并且这种转换是由实现定义的。(C++中,由一个字符组成的字符文字有类型<代码> char < /代码>,例如<代码> siZeof(‘a’)/Cube >等于1,而多字节字符文字有类型<代码> int >与C中相同的方式< /P> 由于字符文字的类型为
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','\0'}
相同),例如,如果您想要一个固定的字符数组,而不使用零结尾符来结束字符串,则使用带有单引号的字符数组,但是,如果您想要一个以零结尾的字符数组,因此适合在
strlen()
printf()
和其他字符中使用,您可以使用双引号。

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

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


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

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

char c = 'c';
const char* s = "s";
c = 'c'
s = "s"
上述语句不仅在文字常量的值(c:单字节存储;s:两字节存储+4/8字节指针)上有所不同,而且在变量类型上也有所不同(c:单字节,某些算术运算;s:4/8字节指针,不同的算术运算)

我向你们假定,后一种差异更为重要;文字常量的存在使变量、函数参数、结构成员等的使用更加容易

此外,在C语言中解决的典型问题属于低级问题,您对单个字符和字符串之间的逻辑差异感兴趣。例如gpio、串口、子串搜索算法

[当然,C也用于其他领域,在更高级别的项目中,如
glib
启蒙
,不太可能看到字符与字符串的区别]

Python是一种高级动态语言

char c = 'c';
const char* s = "s";
c = 'c'
s = "s"
在上面的语句中,局部变量/标签
c
s
指向对象,类型在运行时动态确定。因此,根本不需要区分“字符”和“字符串”

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


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

“c”
是长度为2的字符串。
它有什么用处?
总是太宽或不清楚……:-(一个字符串可以容纳多个字符(因此得名)。这是他们做出的设计决定。“c”是“c”+“\0”,而“c”只是“c”。大多数字符串操作函数将基于尾随“\0”@haccks工作,所以你认为
strlen(“c”)
那么应该返回2吗?我想你只是增加了混淆。字符串的长度不包括终止符。“内存大小”包括。嗯,是的,这是有意义的。根据使用情况,我们可以在C中同时使用这两个。