繁体   English   中英

初始化char和char指针

[英]initializing char and char pointers

这些之间有什么区别:

这个工作:

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

你的第二行不起作用,因为你试图将'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.

你需要记住指针是什么 - 它只是一个保存地址的普通变量就像char保存一个字符值一样。 此地址可用于查找另一个变量(使用*运算符)。

当你执行char* pEmpty = new char ,你给pEmpty new char返回的值,这是一块大到足以保存char值的内存块的地址 然后使用*pEmpty访问此内存并为其赋值*pEmpty 'x'

在第二个例子中,你写了pEmpty = 'x' - 但是请记住pEmpty是一个指针 ,这意味着它应该保存一个地址 'x'是地址吗? 不,这是一个字符文字! 所以这条线并没有真正意义。

在第三个示例中,您将pEmpty指定为字符串文字"x" 这是一个地址吗? 是的。 该文字计算该常量字符串的地址。

请记住,指针与它们指向的类型完全不同。 它们可用于访问该类型的值,但它们是完全不同的类型。

不同之处在于字符串文字存储在程序可以在运行时访问的内存位置,而字符文字只是值。 C ++的设计使得字符文字(例如示例中的字符文字)可以作为机器代码的一部分内联,并且根本不存储在内存位置。

要执行您似乎要执行的操作,您必须定义一个char类型的静态变量,该变量初始化为'x' ,然后设置pEmpty以引用该变量。

第二个例子由于几个原因不起作用。 第一个是你指针指向,特别是没有指针。 第二个是你实际上没有取消引用它,所以你告诉指针指向一个字符文字的地址。 由于它没有地址,编译器会抱怨。

编辑:

为了清楚起见,星号(*)是取消引用指针的运算符。

pEmpty = 'x'; pEmpty (而不是它指向的内存)分配'x'的值。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM