【问题标题】:initializing char and char pointers初始化 char 和 char 指针
【发布时间】:2010-04-06 18:37:00
【问题描述】:

这些有什么区别:

这个有效:

char* pEmpty = new char;
*pEmpty = 'x';

但是,如果我尝试这样做:

char* pEmpty = NULL;
*pEmpty = 'x'; // <---- doesn't work!

和:

char* pEmpty = "x"; // putting in double quotes works! why??

编辑:感谢所有 cmets: 我纠正了它。它应该是 pEmpty ='x', 因此,这一行甚至无法编译: char pEmpty ='x'; 当这条线有效时: char* pEmpty ="x"; //双引号。

【问题讨论】:

  • 所有(嗯,大部分)cmets!,非常感谢你们!我必须选择一个,否则我会选择更多..

标签: c++ char


【解决方案1】:

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

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

【讨论】:

  • 你的意思是这样的?静态字符 xx = 'x'; char* pEmpty = &xx;它有效,太棒了!,我只是想学习一些东西......而且“x”不起作用而“x”会起作用似乎很奇怪。现在我明白这是一个字符文字与字符串文字谢谢!
【解决方案2】:

您的第二行不起作用,因为您试图将'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,第二个可能会崩溃——取消引用 NULL 在 C++ 中无效。您的第二个示例也是未定义的行为,因为您尝试取消引用未初始化的指针。
  • 是的,我更正了。它应该是 pEmpty ='x', 所以,这一行甚至没有编译: char pEmpty ='x';这条线有效: char* pEmpty ="x"; //双引号。
【解决方案3】:

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

当您执行char* pEmpty = new char 时,您将向pEmpty 提供new char 返回的值,这是地址一块足够大的内存来保存一个char 值。然后你使用*pEmpty 来访问这块内存并给它分配char 值'x'。

在第二个示例中,您编写 pEmpty = 'x' — 但请记住,pEmpty 是一个指针,这意味着它应该包含一个地址。 'x' 是地址吗?不,这是字符文字!所以这条线并没有真正的意义。

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

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

【讨论】:

    【解决方案4】:

    第二个例子因为几个原因不起作用。第一个是你已经让指针指向,嗯,没有特别的地方。第二个是您实际上并没有取消引用它,所以您告诉指针指向字符文字的地址。由于没有地址,编译器会报错。

    编辑:

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

    【讨论】:

    • 他没有告诉它指向文字的地址,而是告诉它将字符文字的值转换为地址。
    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      相关资源
      最近更新 更多