【问题标题】:How c-array would be stored/represented in memoryc-array 如何在内存中存储/表示
【发布时间】:2014-04-10 08:51:05
【问题描述】:
char buffer[]="foobar";

我知道缓冲区是指向第一个元素的 char* 指针,所以 buffer==&buffer[0] 但是 为什么&buffer==buffer? &buffer 应该给出缓冲区 char* 的内存地址 而不是第一个元素的地址?

另外,当我做 (int)buffer 时会发生什么?

【问题讨论】:

  • 缓冲区的内存地址第一个元素的内存地址。然而&bufferbuffer 实际上有不同的数据类型,所以如果你真的编写了表达式&buffer == buffer,你至少应该得到一个警告。试试看。
  • 如果您尝试使用(int)buffer,编译器将首先将buffer 转换为指针,然后将该指针的位解释为和int。如果指针大于 int,这也可能导致警告,但我不确定。
  • buffer 不是 指针 (char *) - 它是一个数组 (char []) - 如果您想看到一个重要的区别,请尝试使用 buffer++ .它会衰减到一个指针是各种情况。
  • 请不要对您的问题文本进行激进的更改...这会使更改后第一次查看此内容的人感到困惑。
  • 请避免在回答后删除您的问题。 SO 旨在成为带有答案的问题档案。只是答案将毫无意义。

标签: c arrays pointers


【解决方案1】:

buffer 是第一个元素的地址,而 &buffer 确实是数组本身的地址。该数组将直接存储在堆栈中。这就是 &buffer == 缓冲区的原因。

它不是指针而是数组。如果你将它声明为 char*,它就不会是 &buffer == buffer

【讨论】:

    【解决方案2】:

    这样想。

    buffer 是数组第一个元素的地址。所以它是一个整数的地址。

    &buffer 是数组的地址。因此&buffer 实际上与buffer 相同,但它们的行为会有所不同。

    例如如果你做buffer+1,它会增加int的大小,但&buffer+1会增加数组的大小,即一个元素的大小*元素的数量。


    编辑。最初我写的是buffer++ 而不是buffer+1。请参阅 cmets 部分了解我编辑它的原因。

    【讨论】:

    • @undur_gongor 我不认为保罗对not doing buffer++ 说过任何话。他说这是一个数组,会衰减为指针。因此,IMO,buffer++ 是完全有效的。
    • @undur_gongor 我的错。感谢您注意到它。刚刚编辑了我的答案。
    • 删除了反对票(我建议删除历史资料和所有相关的 cmets)。
    • 您能否进一步改进您的答案?在C语言中,指针不仅仅是一个地址,它还携带着类型信息。两个地址相同,类型不同。所以指针不同。
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2011-12-12
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多