【问题标题】:How is char array stored in memory?char数组如何存储在内存中?
【发布时间】:2019-02-23 19:17:21
【问题描述】:

我对 char 数组的内存地址感到困惑。以下是演示代码:

char input[100] = "12230 201 50";
const char *s = input;
//what is the difference between s and input?

cout<<"s = "<<s<<endl;                    //output:12230 201 50
cout<<"*s = "<<*s<<endl;                  //output: 1

//here I intended to obtain the address for the first element
cout<<"&input[0] = "<<&(input[0])<<endl;  //output:12230 201 50

char 数组本身是一个指针吗?为什么 & 运算符不给出 char 元素的内存地址?如何获取各个条目的地址?谢谢!

【问题讨论】:

    标签: c++


    【解决方案1】:

    在您的最后一行中,表达式&amp;(input[0]) 确实会导致您的char 数组的第一个字符的地址,即您的char 数组input 的地址。所以你的代码有点工作。

    但输出运算符 &lt;&lt;char * 有一个有用的重载,并将您的 char 数组的比赛打印为 C 字符串(打印所有字符,直到找到零字符)。

    要打印地址,请执行以下操作:

    void *p = input;
    std::cout << "p=" << p << "\n";
    

    【讨论】:

    • 谢谢,但我没有发现打印时使用“\n”有什么区别,但是在&前面加上(void*)可以给出地址。
    • 是的。 \n 与指针无关。这只是一个换行符。重要的一点是打印void*
    • @jingweimo "\n" 只是在输出流中输出换行符的一种方式。 std::endl 输出换行符,但也会刷新输出缓冲区。通常不需要手动刷新缓冲区,所以很多人更喜欢 '\n' 或 "\n" (在某些情况下它可能更快)。
    • @Blast:是的!当您将输出重定向到文件时,它可能会慢几个数量级。冲洗几乎总是不必要的。 std::endl 是一种误解,不应在正常代码中使用。
    【解决方案2】:

    尽管在大多数情况下可以将数组视为指向数组中第一个元素的指针,但它们与指针不同。从技术上讲 - arrays decay to pointers

    &amp;(input[0]) 返回一个char*,它有一个打印实际字符串的重载。要打印地址,您可以使用static_cast&lt;void*&gt;(&amp;input[0])

    【讨论】:

    • 不,数组不是指向其第一个元素的指针。他们衰败给他们。这并不意味着它们是相同的,即使它可以帮助初学者了解如何使用它们。
    • @Fureeish 小心。除了 4 个例外(sizeof 运算符、_Alignof 运算符或一元 '&amp;' 运算符或用于初始化数组的 字符串文字)访问数组是通过指向第一个元素。上面的&amp;(input[0]) 实际上是char* 等价于input。唯一需要注意的是&amp;input 是指向int [100] 数组的指针。
    • 访问不是身份。如果我们考虑访问以外的其他方面,这一点仍然存在。
    • @David:那么多维数组呢?那么没有指针数组。不,数组与指针完全不同。他们只是腐烂到他们身上。
    • 我会删除这个答案,但因为它是公认的答案,所以这是不可能的。更新了解释 cmets 的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多