打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
为什么C语言没有String类型?


C 是静态弱类型语言。意味着类型(包括 size 等信息,你使用 sizeof 就是编译时候得到的)在编译的时候就能确定下来。

它的原生简单类型有 char int float 这样的,原生复合类型有 struct,以及“伟大”的 指针类型 primitive_type * .

这些类型的设计是在编译时可以明确确定存储空间大小,比如 char 占一个字节。32bit 机器上的指针为 4 Bytes.

所谓的 String 类型,它的大小不能在编译的时候确定下来,因为你将存储 string 的长度不是固定的,可大可小。你说编译器给 string 分配多少合适?

所以在 C 中 string 只能以复合类型存在,一般用 struct 包含一个指针类型和一个表示存储空间大小的整数类型。

你见到的其他语言的 string 也并非它最基本的类型。只不过作为标准库提供出来了,方便使用。C 不屑于干这事 —— 因为它有“伟大”的指针。

不管C还是C++,语言都没有string类型。你应当问“为什么C语言的标准库没有string类型”。
其实C语言使用0终结的字符数组作为string类型,因为C的标准库的字符串操作都是以此设计的。
另外,一些别的基本库是有string类型的,比如glib就提供了包含有长度信息的string类型,及其操作函数。
struct GString {  gchar  *str;  gsize len;  gsize allocated_len;};

有啊,怎么没有啊,char× 和 wchar× 不就是 C 语言里的字符串类型吗?

C 语言又不是面向对象型语言(不表示它不能用来表达面向对象),没有类和方法的概念,你就算是定义一个 string 类型,又能怎样呢?还不是要再定义一大堆类似这样的函数:
size_t strlen(string str);

这跟现实中的 C 库有什么不同吗?C 语言不过是把 string 内部怎么构成的也告诉你了而已嘛。

不但如此,string 还会带来一些不便:
  • C 语言没有操作符重载,如果 string 不是一个数组,那么 str[n] 这样的写法就没有了,这不是自找麻烦吗?
  • C 语言的拷贝很简单,就是直接拷贝变量,拷贝指针就是让两个指针指向同一个地址。那么,string str1 = str2,这样的语句,表达什么意思?如果是仅拷贝地址,那么 string 不是指针哦,如果是复制内容,那 C 语言没有操作符重载哦。
  • C 语言的字符串是一个数组,于是我们可以很简单的通过指针滑动来表示子串,如果存在string,这么做就行不通了。同时,C 语言规定字符串以‘\0’结尾,但是我们常常可以通过规定长度将不以‘\0’结尾的字符数组当作字符串处理,如果 string 存在,也行不通了。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
结构体的定义和使用
char字符串数组与string之间的转换,以及sizeof,strlen,length的区别
整理C语言中各种类型指针的特性与用法
深入理解C语言
关于sizeof(string)
Delphi 中String类型原理介绍
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服