(C++)使用指向整数的顺从指针初始化字符串变量并且它正在打印某些内容?

(C++) Initializing a string variable with a deferenced pointer pointing to an integer and it's printing something?

本文关键字:变量 打印 字符串 初始化 C++ 整数 指针      更新时间:2023-10-16

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

#include <iostream>
using namespace std; 
int main()
{
   string thisIsAString; 
   int randomVariable = 32; 
   int *ptrRandomVar = &randomVariable;
   *ptrRandomVar = 1000; 
   thisIsAString = *ptrRandomVar; 
   cout << thisIsAString << endl;
 }

所以当我输出这个时,它会给我结果350,我不知道它意味着什么。

感谢所有帮助:)!谢谢你抽出时间。

   thisIsAString = *ptrRandomVar; 

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

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

;TLDR1000=0x3E8->char 0xE8=232=\350(八进制)

这是一步一步发生的事情:

  • *ptrRandomVar = 1000; 1000被编码为0x3E8,这意味着在内存中,假设您使用的是一个小的endian平台,则会得到E8030000...

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

  • cout << thisIsAString << endl;您要求输出字符串:在没有其他特定代码的情况下,输出为标准ASCII编码。然而,0xE8(=232)超出了标准ASCII范围(在127处停止)。因此,默认行为是输出其八进制值,前面加一个反斜杠。232(0xE8)在八进制中给出\350。

您可以将整数转换为字符串,然后进行赋值。