字符 a 和字符串 a 的存储方式如何与 c 中的空终止不同?



我从一本书中看到了这一行,当我们将"a"存储为字符串时,它存储为字符常量,后跟空字符,指针指向它。但是当我们存储字符"a"时,它会作为整数存储在内存中。 不是字符串也被存储为相应的整数,只是要用空字符终止。

字符串是包含 0 值终止符的字符值序列 - 字符串"hello"由字符序列{'h', 'e', 'l', 'l', 'o', 0}表示。

每个单独的字符都表示为一个小整数,用于存储该字符的编码(ASCII、EBCDIC、UTF-8 或其他编码(。 上述序列的 ASCII 编码将{104, 101, 108, 108, 111, 0}

字符串存储在字符类型的数组中(ASCII、EBCDIC 和 UTF-8charwchar_tUTF-16 等"宽"字符编码(。 这包括字符串文本,这些文本的存储方式使它们在整个程序中可见。

除非它是sizeof或一&元运算符的操作数,或者是用于初始化声明中的字符数组的字符串文本,否则类型为"T的 N 元素数组"的表达式将转换为类型"指向T的指针",并且表达式的值是数组第一个元素的地址。 这就是为什么你在处理字符串时经常看到char *- 这是 C 如何处理数组表达式的结果。

大多数字符串和 I/O 库函数采用char *参数,该参数指向字符串中的第一个字符(即存储字符串的数组的第一个元素(。 这些函数将通过"遍历"数组来处理这些字符串,直到它们看到 0 终止符。 由于传递给函数的只是第一个元素的地址,因此函数不知道存储函数的数组有多大。 它依赖于该 0 终止符的存在来知道何时停止处理。这就是为什么像strcpy这样的操作可能是危险的 - 如果您尝试将 20 个字符的字符串复制到大小仅为容纳 10 个字符的数组,那么这额外的 10 个字符将被写入数组之后的内存中,这将产生不可预测的影响。

最新更新