初始化字符和字符指针

6
这些有什么区别:
这个可以工作:
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"; //使用双引号。


所有(好吧,大部分)的评论!非常感谢大家!我只能选择一个,否则我会选择更多... - ra170
5个回答

11

由于您试图将'x'赋给pEmpty而不是*pEmpty,因此您的第二行代码不起作用。

编辑:感谢Chuck的更正。它还不起作用,因为您需要分配一些内存来保存值'x'。请参见以下示例。

第三行可以工作,因为您使用了初始化程序而不是常规赋值语句。

一般来说,您应该理解指针和解引用的工作原理。

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.

第二个例子如果尝试给*pEmpty赋值,可能会崩溃——在C++中,解除引用NULL是无效的。您的第二个示例也是未定义的行为,因为您尝试解除引用未初始化的指针。 - Chuck
是的,我已经更正了。它应该是 pEmpty ='x', 所以这一行甚至无法编译通过:char pEmpty ='x'; 而这一行可以工作:char* pEmpty ="x"; //双引号。 - ra170

2
你需要记住指针是什么 - 它只是一个保存地址的普通变量,就像 char 变量保存字符值一样。这个地址可以用于查找另一个变量(使用 * 运算符)。
当你执行 char* pEmpty = new char 时,你给 pEmpty 赋予了 new char 返回的值,即足以容纳 char 值的内存块的地址。然后你使用 *pEmpty 访问该内存并将其分配为 char 值 'x'。
在第二个例子中,你写的是 pEmpty = 'x',但请记住 pEmpty 是一个指针,这意味着它应该保存一个地址。'x' 是一个字符字面量,而不是地址。所以那行代码没有任何实际意义。
在第三个例子中,你将字符串字面量 "x" 分配给了 pEmpty。这是一个地址吗?是的,它是。该字面量评估为该常量字符串的地址。
记住,指针与它们指向的类型完全不同。它们可以用于访问该类型的值,但它们是自己完全不同的类型。

1

区别在于字符串字面量存储在程序运行时可以访问的内存位置中,而字符字面量只是值。C++被设计成字符字面量(例如您在示例中使用的)可以作为机器代码的一部分进行内联,并且根本不会真正存储在内存位置中。

要做您似乎正在尝试做的事情,您必须定义一个类型为char的静态变量,该变量初始化为'x',然后将pEmpty设置为引用该变量。


你是这个意思吗? static char xx = 'x'; char* pEmpty = &xx; 没错,太棒了!我只是想学点东西。让我感到奇怪的是,'x' 不起作用,而 "x" 可以正常工作。现在我明白了,它们分别代表字符字面量和字符串字面量。谢谢! - ra170

0

pEmpty = 'x';将值'x'赋给pEmpty(而不是它指向的内存)。

*pEmpty = 'x'; //this is probably what you want

0
第二个例子有几个问题。首先,您让指针指向了一个不确定的位置。其次,您没有实际解引用它,因此您告诉指针指向字符文字的地址。由于它没有地址,编译器会报错。
编辑:
为了明确起见,星号(*)是解引用指针的运算符。

1
他没有告诉它指向文字的地址,而是告诉它将字符文字的值转换为地址。 - Chuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接