为什么一个字符串不是 return 它的内存位置?

Why does a string not return its memory location?

他们说字符串自然是一个字符数组,表示第一个字符的内存位置:string == &string[0]。这就是为什么当用户希望程序将数据读入该变量时,用户不必在字符串变量前指定 & 符号:

scanf("%s", string);

但是有一个合理的问题:为什么我们在打印 string 时看不到字符串的内存位置?

printf("%s", string);

But then there is a reasonable question: why don't we see &string[0] when printing string out?

printf("%s", string);

我假设你的意思是你希望看到打印的地址而不是内容。

这就是格式说明符的用途。 您将第一个字符的地址传递给 printf 并且因为该参数有一个 %s 格式说明符,该函数知道它必须获取地址,取消引用它并打印任何字符直到 0在内存中找到。

如果您提供了 %p 格式说明符,您会看到打印的地址。 在这种情况下,您需要将地址转换为 void* 才能完全符合标准。

They say a string is naturally an array of characters which represents the memory location of its first character: string == &string[0]

这里有两个小的澄清。

字符串在技术上不是字符数组。它被定义为 “由第一个零代码单元终止的连续代码单元序列” 或者正如 RobertS 在评论中所说:“一个字符串可以是(和高-可能是) 存储在数组中,但字符串不是数组。字符串只是以空字符结尾的字符序列。字符串不是数组,数组也不是字符串。"

如果string是数组而不是指针,那么它们会有不同的类型。 stringchar[] 类型,&string[0]char* 类型。但是,如果您进行比较 string == &string[0],则 string 将衰减为 char*,并且表达式的计算结果为真。

相关:

Is an array name a pointer?