2

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

//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;

print out 语句打印A@@而不是仅打印A. 我不确定我做错了什么。

4

3 回答 3

9

尝试

cout << *cp << endl;

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

于 2011-03-06T18:10:13.043 回答
5

遗憾的是,从 C 编程语言的起源来看,char *(即指向字符的指针)并不仅仅被视为指向像 int *(指向 int 的指针)或 float *(指向 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 << sz << endl; 此操作时,程序会将指向字符的指针解释为指向以 nul 结尾的字符缓冲区的指针,并将字符串 123 转储到输出流 cout。它查看地址 0x00050014 处的值并查看其是否为 NUL(即 0),如果不是,则转储该字符,然后查看下一个地址。如果 0x00050015 不是 NUL,它会将 IT 转储出去。然后 0x00050016 处的值,看到它不是 NUL,将其转储,然后它到达 0x00050017 并看到它是 NUL,并且不会将其转储,并停止查看地址并在您执行的位置之后返回您的代码sz 的输出,特别是在这段代码中,它将返回到将 endl(行尾)转储到 cout 的点;

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

于 2011-03-06T18:52:01.523 回答
3

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

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

如果你想要指针值,或者

cout << *cp << endl;

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

于 2011-03-06T18:10:49.660 回答