【问题标题】:Why does a string not return its memory location?为什么字符串不返回其内存位置?
【发布时间】:2020-07-18 08:30:02
【问题描述】:

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

scanf("%s", string);

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

printf("%s", string);

【问题讨论】:

  • 如果它在一个实例中衰减到一个指针,为什么你会期望它在两个实例中都不会呢?
  • 您能否更准确地了解您希望它打印的内容?创建一个最小的 main 函数并显示输入、预期输出和实际输出。
  • @klutt 我希望 &string[0] 代表什么——字符串内存位置。由于 string == &string[0],我希望 string 给出与 &string[0] 相同的值,这就是问题所在。
  • 如果p是一个指针,那么表达式p&p[0]是一样的。
  • @Kaiyaha 是的,但这在问题中并不清楚。如果您的意思是应该打印文字字符串 "&string[0]" 或 i t 的地址,这有点模棱两可。

标签: c scanf memory-address


【解决方案1】:

但是有一个合理的问题:为什么我们在打印字符串时看不到 &string[0]?

printf("%s", string);

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

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

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

【讨论】:

【解决方案2】:

他们说字符串自然是一个字符数组,表示其第一个字符的内存位置:string == &string[0]

这里有两个小说明。

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

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

相关:

Is an array name a pointer?

Can it cause problems to pass the address to an array instead of the array?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2021-08-23
  • 2020-07-06
  • 2018-09-17
  • 2011-11-04
  • 1970-01-01
相关资源
最近更新 更多