C++ 字符数组如何存储在内存中?

C++ 字符数组如何存储在内存中?,c++,C++,我对字符数组的内存地址感到困惑。以下是演示代码: 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<<en

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

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输入[100]=“122302150”;
const char*s=输入;
//s和输入之间的区别是什么?

cout在最后一行中,表达式
&(输入[0])
确实会产生字符数组的第一个字符的地址,即字符数组
输入的地址。所以你的代码可以正常工作


但是输出操作符
即使在大多数情况下,数组可以被认为是指向数组中第一个元素的指针,但它们与指针不同。技术上-


&(输入[0])
返回一个
char*
,该字符有一个重载,用于打印实际字符串。要打印地址,您可以使用
static\u cast(&input[0])

谢谢,但我没有发现在打印时使用“\n”有任何区别,但将(void*)放在前面可以给出地址。是的。
\n
与指针无关。这只是一个换行。重要的一点是打印一个
void*
@jingweimo“\n”只是在输出流中输出换行符的一种方式。std::endl
输出换行符,但也刷新输出缓冲区。通常不需要手动刷新缓冲区,因此许多人更喜欢“\n”或“\n”(在某些情况下可能更快)。@Blast:是的!当您将输出重定向到文件中时,速度可能会慢几个数量级。冲洗几乎总是不必要的
std::endl
是一个错误的概念,不应在普通代码中使用。不,数组不是指向其第一个元素的指针。它们会腐烂。这并不意味着它们是相同的,即使这可以帮助初学者理解如何使用它们。@Fureeish小心。除了4个异常(
sizeof
运算符、
\u Alignof
运算符、一元
'&
运算符或用于初始化数组的字符串文本)之外,通过指向第一个元素的指针访问数组<上面的代码>&(输入[0])
实际上是
char*
相当于
input
。唯一需要注意的是
&input
将是指向
int[100]
数组的指针。访问不是标识。如果我们考虑其他方面而不是访问,这一点仍然存在。@戴维:那么多维数组呢?那时没有指针数组。不。数组与指针有很大不同。我会删除这个答案,但因为这是公认的答案,所以这是不可能的。更新答案以解释评论。
void *p = input;
std::cout << "p=" << p << "\n";