1

我一直试图在我的编程文凭上取得一些领先地位,并决定自学一些 C++ 以了解我正在学习的内容。所以我的情况是我已经初始化了一个名为 thisIsAString 的字符串变量,方法是为其分配指向整数变量的延迟指针的值。我认为它不起作用,因为它们不是真正兼容的变量类型,但在将结果输出到控制台时确实给了我 350 美元。我想了解它的实际含义。这是代码:

#include <iostream>
using namespace std; 

int main()
{
   string thisIsAString; 
   int randomVariable = 32; 

   int *ptrRandomVar = &randomVariable;
   *ptrRandomVar = 1000; 

   thisIsAString = *ptrRandomVar; 

   cout << thisIsAString << endl;
 }

因此,当我输出它时,它给了我结果 \350,我不知道这意味着什么。

感谢所有帮助:)!感谢您的时间。

4

3 回答 3

6
   thisIsAString = *ptrRandomVar; 

是关键线。*ptrRandomVar 的值为 1000(十进制)。使用标准转换规则将其转换为 char,这会将其截断为 232(十六进制的 1000 为 0x3e8,截断后得到 0xe8 == 232)。这为您提供了一个包含值为 232 的字符的字符串。

当您打印该字符时,您的标准库不知道如何打印值为 232 的字符,因此它以八进制为您写出(我不知道这是否是标准的),这给了您字符 "\350 " 其中 0350 是八进制的 232。

于 2013-07-05T08:02:35.243 回答
2

;TLDR 1000 = 0x3E8 -> 字符 0xE8 = 232 = \350(八进制)

这是一步一步发生的:

  • *ptrRandomVar = 1000;1000 被编码为 0x3E8,这意味着E8030000...假设您使用的是 little-endian 平台,则在内存中。

  • thisIsAString = *ptrRandomVar;现在您将此 int 分配给您的字符串。您的编译器不会抱怨!您可以使用 char(也是 1 字节整数类型)初始化字符串,并且可以使用从 int 到 char 的隐式数字转换。所以你的字符串现在大小为 1 并且 char 的值为 0xE8 (其余的被截断)

  • cout << thisIsAString << endl;您要求输出字符串:没有其他特定代码,输出是标准 ASCII 编码。但是 0xE8 (=232) 超出了标准 ASCII 范围(在 127 处停止)。所以默认行为是输出它的八进制值,前面有一个反斜杠。并且 232 (0xE8) 给你 350 八进制。

于 2013-07-05T08:08:43.917 回答
1

您可以将整数转换为字符串,然后分配它。

于 2013-07-05T07:55:02.163 回答