【问题标题】:Problem dereferencing char pointer in C++在 C++ 中取消引用 char 指针的问题
【发布时间】:2011-07-09 21:37:24
【问题描述】:

我有一个小的学校作业。我的输出不正确。你能看看我做错了什么吗?

//1. Create a char pointer named cp
char *cp;

//2. Dynamically allocate a char and store its address in cp
char dynamicChar = 'A';
cp = &dynamicChar;

//3. Write the character 'x' into the char
*cp = 'x';

//4. Print out the value of the char using cout
cout << cp << endl;

打印输出语句打印A@@ 而不仅仅是A。我不确定我做错了什么。

【问题讨论】:

  • “动态分配一个字符” - 可能意味着:cp = new char;

标签: c++ pointers char dereference


【解决方案1】:

试试

cout << *cp << endl;

你想打印字符,而不是指向它的指针。当你把指针交给它时,cout 认为你是在告诉它从那里打印出一个字符数组。

【讨论】:

  • @Tony 不要忘记通过单击复选标记将答案标记为“已接受”
【解决方案2】:

遗憾的是,从 C 编程语言的起源来看,char *(即指向字符的指针)并不仅仅被视为指向诸如 int *(指向 int 的指针)或 float *(指向浮点的指针)之类的类型的指针,但是许多库函数将它们视为以 NUL 字符结尾的字符串。 “字符串”是指文本。

因此,有很多库函数将 char* 视为特殊情况并将它们视为“以 nul 结尾的字符串”,这意味着它将将该指针视为(即多个连续)字符的数组,直到它到达一个 NUL 字符(即数值 0,而不是数字字节值为 48 或 0x30 的字符“0”)。

所以,如果你的代码中有

char *sz = "123";

这将分配 4 个字符,你看到的 3 个加上 NUL 字符

Addr:0x00050014 0x31  // ASCII char '1'
Addr:0x00050015 0x32  // ASCII char '2'
Addr:0x00050016 0x33  // ASCII char '3'
Addr:0x00050017 0x00  // ASCII char nul

sz(指向字符的指针,表示地址)将具有值 0x00050014(请注意,起始地址值由您的计算机通过编译器、链接器、加载器、然后可能是程序本身)。

当你这样做时 cout &lt;&lt; sz &lt;&lt; endl; 程序会将指向字符的指针解释为指向以 nul 结尾的字符缓冲区的指针并转储字符串 123 到输出流 cout。它查看地址 0x00050014 处的值并查看其是否为 NUL(即 0),如果不是,则转储该字符,然后查看下一个地址。如果 0x00050015 不是 NUL,它会将 IT 转储出去。然后 0x00050016 处的值,看到它不是 NUL,将其转储,然后它到达 0x00050017 并看到它是 NUL,并且不会将其转储,并停止查看地址并在您执行的位置之后返回您的代码sz 的输出,特别是在这段代码中,它将返回到将 endl(行尾)转储到 cout 的点;

您最终将学习到比旧的 C 风格 char* 机制更好的文本表示方法,但现在,您只需要了解存在的遗留行为即可。

【讨论】:

    【解决方案3】:

    C++(或者,更具体地说,在这种情况下为ostream),将自动将char* 视为(C 风格)字符串。您需要将其显式转换为您想要的类型,例如:

    cout << (void*)cp << endl;
    

    如果你想要 指针 值,或者

    cout << *cp << endl;
    

    如果你想要角色本身(正如你的问题所表明的那样)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多