我有一份小型的学校作业。我的输出不正确。你能看出我做错了什么吗?
//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
。我不确定我做错了什么。
答案 0 :(得分:10)
尝试
cout << *cp << endl;
您想要打印字符,而不是指向它的指针。当你把指针交给它时,cout
认为你告诉它从那里打印出一个字符数组。
答案 1 :(得分:5)
可悲的是,从C编程语言的起源,char *(即指向字符的指针)不仅仅被视为指向类型的指针,如int *(指向int的指针)或float *(指向浮点的指针),但是许多库函数将这些函数视为NUL字符终止字符串。 “字符串”是指文字。
因此,有很多库函数将char *视为特殊情况并将它们视为“以空字符结尾的字符串”,这意味着它会将该指针视为ARRAY(即多个连续的)字符,直到它到达一个NUL字符(即数字值0,而不是字符'0',其数字字节值为48或0x30)。
所以,如果你的代码中有
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(请注意,起始地址值由计算机通过编译器通过多个步骤确定,然后是链接器,然后是加载器,然后可能是progrma本身)。
当你这样做的时候
cout << sz << endl;
程序会将指向字符的指针解释为指向以空字符结尾的字符缓冲区的指针并转储字符串
123
到输出流cout。它查看地址0x00050014处的值并查看其是否为NUL(即0),如果没有,则转出该字符,然后查看下一个地址。如果0x00050015不是NUL,则会将IT转储出去。然后0x00050016处的值,看到它不是NUL,将其转储出来,然后它到达0x00050017并看到它是NUL,并且不会将其转储出去,并且停止查看地址并在您执行之后返回到您的代码sz的输出,特别是在这段代码中它将返回到它将endl(行尾)转储到cout的点;
您最终将学习更好的方式来表示文本而不是旧的C风格的char *机制,但是现在,您只需要了解存在的遗留行为。
答案 2 :(得分:3)
C ++(或者,更具体地,在这种情况下为ostream
),会自动将char*
视为(C样式)字符串。您需要将其显式地转换为所需的类型,例如:
cout << (void*)cp << endl;
如果您想要指针值或
cout << *cp << endl;
如果您想要角色本身(正如您的问题似乎表明的那样)。