初始化char和char指针

时间:2010-04-06 18:37:00

标签: c++ char

这些之间的区别是什么:

这个有效:

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”; //双引号。

5 个答案:

答案 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