在C++中解除引用char指针的问题

Ton*_*ony 2 c++ pointers char dereference

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

//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;
Run Code Online (Sandbox Code Playgroud)

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

Bet*_*eta 10

尝试

cout << *cp << endl;
Run Code Online (Sandbox Code Playgroud)

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

  • @Tony不要忘记点击复选标记将答案标记为"已接受" (10认同)

fra*_*ji1 5

遗憾的是,从它的C编程语言的起源,char*(即指向字符的指针)不仅仅被视为指向类型的指针,如int*(指向int的指针)或float*(指向float的指针),但是很多库函数将这些函数视为NUL字符终止字符串."字符串"是指文本.

因此,有很多库函数将char*视为特殊情况并将它们视为"以空字符结尾的字符串",这意味着它会将该指针视为ARRAY(即多个连续的)字符,直到达到NUL字符为止(即数值0,而不是字符'0',其数字字节值为48或0x30).

所以,如果你的代码中有

char *sz = "123";
Run Code Online (Sandbox Code Playgroud)

这将分配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
Run Code Online (Sandbox Code Playgroud)

sz(指向字符的指针,表示地址)将具有值0x00050014(请注意,起始地址值由您的计算机通过编译器通过多个步骤确定,然后是链接器,然后是加载器,然后可能是progrma本身) .

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

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