字符串的基础知识

时间:2010-06-19 22:00:33

标签: string

好吧,我一直都知道计算机将字符串视为一系列数字,但我从未真正了解它的工作原理。例如,当我们这样做时,平均编译器/处理器会发生什么样的魔力呢?

string myString = "foo";
myString += "bar";
print(myString) //replace with printing function of your choice

4 个答案:

答案 0 :(得分:1)

答案完全取决于所讨论的语言。但是C通常是一种很好的语言,可以看到幕后发生的事情。

在C:

在C字符串中是char的数组,最后为0:

char str[1024];
strcpy(str, "hello ");
strcpy(str, "world!");

幕后str [0] =='h'(有一个int值),str [1] =='e',... str [11] =='!',str [12] =='\ 0';

char只是一个可以包含256个值之一的数字。每个字符都有一个数值。

在C ++中:

字符串的支持方式与C相同,但您也有string类型,它是STL的一部分。

字符串文字是静态存储的一部分,除非您需要未定义的行为,否则无法直接更改。

它的实现依赖于字符串类型在幕后实际工作的方式,但字符串对象本身是可变的。

在C#中:

字符串是不可变的。这意味着一旦创建了字符串,就不能直接更改它。当你做+ =发生的事情是新的字符串被创建,你的字符串现在引用新的字符串。

答案 1 :(得分:1)

当然,实现在语言和编译器之间有所不同,但通常对于C来说,它类似于以下内容。请注意,字符串基本上是C语言中的char数组(char[])的语法糖。

1

string myString = "foo";
  • 为阵列分配3个字节的内存,并将第1个字节的值设置为'f'(相反,其ASCII码),将第2个字节设置为'o',将第2个字节设置为'o'。

2

foo += "bar";
  • foo指向的内存中读取现有字符串(char数组)。

  • 分配6个字节的内存,使用foo的读取内容填充前3个字节,使用ba和{{1}填充接下来的3个字节}}

3

r
  • 读取现在指向内存的字符串print(foo) ,并将其打印到屏幕上。

这是一个非常粗略的概述,但希望能给你一般的想法。

旁注:在某些语言/编译器中,char!= byte - 例如,C#,其中字符串默认以Unicode格式存储,特别是字符串的长度也存储在记忆。 C ++通常使用以null结尾的字符串,它以另一种方式解决问题,但这意味着确定其长度为O(n)而不是O(1)。

答案 2 :(得分:0)

它非常依赖语言。但是,在大多数情况下,字符串是immutable,所以这样做会分配一个新字符串并释放旧字符串。

答案 3 :(得分:0)

我假设你的样本中有一个拼写错误,并且只有一个名为foo或myString的变量,而不是两个变量?

我会说它很大程度上取决于你正在使用的编译器。在.Net字符串是不可变的,所以当你添加“bar”时,你实际上并没有添加它,而是创建一个包含“foobar”的新字符串,并告诉它将它放在你的变量中。
在其他语言中,它将以不同的方式工作。