【发布时间】:2017-11-04 01:59:01
【问题描述】:
我正在学习 C++。在这里显示的程序中,据我所知,str1 和str2 存储每个相关字符串的第一个字符的地址:
#include <iostream>
using namespace std;
int main()
{
char str1[]="hello";
char *str2="world";
cout<<str1<<endl;
cout<<str2<<endl;
}
但是,str1 没有给出任何警告,而 str2 我收到了这个警告:
warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
char *str2="world";
这两个声明在第二种情况下导致警告而不是第一种情况有什么不同?
【问题讨论】:
-
"str1 和 str2 存储字符串第一个字符的地址"。这不是真的。
str1存储整个字符串本身的副本。它不存储任何“地址”。另一方面,str2确实存储了地址。 -
HI ANT,如果一个副本存储在 str1 中,“hello”的另一个副本将存储在哪里?如果我们修改 str1 副本说 str[0]='H',这个更改会影响另一个副本吗?
-
原始
"hello"存储在静态且不可修改的内存中。当您执行str[0] = 'H'时,您会修改存储在str1中的副本。原件保持不变。
标签: c++ arrays string pointers string-literals