int main()
{
char *second= new char("hello");
char *first="hi";
char third[]="new";
}
我是c +的新手,并不真正理解char是如何工作的,为什么第一个产生编译器错误,以及这三种声明方式的差异,以及以特定方式声明它的强度和好处
谢谢
嗯,正如有人提到第二种形式是只读的,为什么我可以改变它。假设我有以下代码
int main()
{
char *second= new char("hello");
char *first="hi";
char third[]="new";
first="world";
}
上面的代码仍会执行,为什么会这样? ,如果我想读取输入但不知道字符串的大小,那么哪种形式更好?
答案 0 :(得分:12)
知道
"abc"
在某处分配静态存储,这将持续整个程序的生命周期。您无法写入该存储,因此C ++为其指定了类型char const[N]
(N个常量字符的数组)。现在,以下内容使指针指向该存储
char *first = "hi";
由于丢弃了const
,因此不推荐使用这种初始化指针的方式。它的工作原理只是为了保持与C的向后兼容性,其中字符串文字没有const类型(但仍然是只读的)。请改为选择
char const *first = "hi";
相比之下,您展示的最后一种方法是将字符串文字的内容复制到一个可写的数组中,并调整大小以使字符串文字适合它。
char third[] = "new";
如果在函数中执行此操作,那么作为所有变量,当您离开其范围时,该数组将被清除。现在,你展示的第一种方式是不同的。它动态创建一个角色。你可以像这样初始化它
char *c = new char('A');
因为这是动态发生的,所以你需要明确地告诉编译器什么时候应该释放内存
delete c;
但是你不能用字符串文字初始化字符。你可能想到的是动态创建存储,用字符串文字初始化。使用new
是不可能的。初始化动态数组的唯一形式是将其清零,但不能使用字符串文字或其他数组的内容直接初始化。对于这种使用new
的形式,很少需要直接这样做。如果需要,可以通过创建正确大小的动态数组,然后将字符串文字中的字节复制到该缓冲区来实现。
char *c = new char[sizeof "hello"]; // sizeof "hello" will give 6
std::strcpy(c, "hello");
delete[] c; // delete[] is for deleting dynamic arrays
请记住,这是非常低级的,我建议你使用字符串
std::string s = "hello"; // s.size() gives you its size
它完全管理你的记忆。连接,索引和那些东西也是可用的。
答案 1 :(得分:1)
让我们尝试用代码解释:
// your code
char *first="hi";
// this is the memory location of the string, assigned by the compiler
// sizeof(first) == sizeof(char*) == 4 (usually, lets not get into this right now)
char *first = 0x12345;
// your code
char third[]="new";
// means, the following:
char third[4];
third[0] = 0x6E; // ascii code of 'n'
third[1] = 0x65; // ascii code of 'e'
third[2] = 0x77; // ascii code of 'w'
third[3] = 0x00; // strings in C end with NULL
// note that sizeof(third) is still sizeof(char*), but this
// time you statically allocated sizeof(char)*4 for the whole array
更多阅读材料: