这些之间的区别是什么:
这个有效:
char* pEmpty = new char;
*pEmpty = 'x';
但是,如果我尝试这样做:
char* pEmpty = NULL;
*pEmpty = 'x'; // <---- doesn't work!
和
char* pEmpty = "x"; // putting in double quotes works! why??
编辑:感谢您的所有评论: 我纠正了。它应该是 pEmpty ='x', 所以,这行甚至不编译:char pEmpty ='x'; 这行有效:char * pEmpty =“x”; //双引号。
答案 0 :(得分:10)
您的第二行不起作用,因为您尝试将'x'
分配给pEmpty
而不是*pEmpty
。
修改:感谢Chuck的纠正。它也不起作用,因为你需要分配一些内存来保存值'x'
。请参阅下面的示例。
第三行确实有效,因为您使用的是initalizer而不是常规赋值语句。
通常,您应该了解指针和解除引用的工作方式。
char *p = new char(); // Now I have a variable named p that contains
// the memory address of a single piece of character
// data.
*p = 'x'; // Here I assign the letter 'x' to the dereferenced value of p;
// that is, I look up the location of the memory address contained
// in p and put 'x' there.
p = 'x'; // This is illegal because p contains a memory address,
// not a character.
char q = 'x'; // Now I have a char variable named q containing the
// character 'x'.
p = &q; // Now I assign the address of q (obtained with the reference
// operator &) to p. This is legal because p contains a memory
// address.
答案 1 :(得分:2)
你需要记住指针是什么 - 它只是一个包含地址的正常变量 ,就像char
包含一个字符值一样。此地址可用于查找另一个变量(使用*
运算符)。
当您执行char* pEmpty = new char
时,您将pEmpty
提供new char
返回的值,地址一块足够大的内存持有char值。然后使用*pEmpty
访问此内存并为其赋值char 'x'
。
在第二个示例中,您编写pEmpty = 'x'
- 但请记住pEmpty
是指针,这意味着它应该包含地址 。 'x'
是地址吗?不,这是一个字符文字!所以这条线并没有多大意义。
在第三个示例中,您要为pEmpty
分配字符串文字"x"
。这是一个地址吗?是的。该文字计算该常量字符串的地址。
请记住,指针与它们指向的类型完全不同。它们可用于访问该类型的值,但它们是完全不同的类型。
答案 2 :(得分:1)
不同之处在于字符串文字存储在程序可以在运行时访问的内存位置,而字符文字只是值。 C ++的设计使得字符文字(例如示例中的字符文字)可以作为机器代码的一部分内联,并且根本不会真正存储在内存位置。
要执行您似乎要执行的操作,您必须定义一个初始化为char
的{{1}}类型的静态变量,然后设置'x'
以引用该变量。
答案 3 :(得分:0)
第二个例子由于一些原因不起作用。第一个是你指针指向,特别是没有指针。第二个是你实际上没有取消引用它,所以你告诉指针指向一个字符文字的地址。由于它没有地址,编译器会抱怨。
编辑:
为了清楚起见,星号(*)是取消引用指针的运算符。
答案 4 :(得分:0)
pEmpty = 'x';
分配pEmpty
(而不是它指向的内存)'x'的值。
*pEmpty = 'x'; //this is probably what you want