Visual Studio变量类型星号

时间:2016-10-12 00:08:08

标签: c++ arrays visual-studio variables printing

使用Visual Studio,我遇到了一个int类型变量和一个float类型变量的问题。它们都存储在自己的数组中。当我把它们打印出来时,它们作为记忆位置出现了胡言乱语。当我调试时,我发现在监视区域的内存乱码旁边会显示正确的值。我还注意到在类型下,变量类型旁边有一个*(星号)。有人可以提供有关为什么会发生这种情况的信息吗?提前谢谢。

观看区域看起来像这样......

名称值类型

得分0x002ff5c8 {96.0000000}浮动*

studentID 0x002ff698 {9317} int *

2 个答案:

答案 0 :(得分:1)

我建议阅读上面的教程,也许是一本入门书,取决于你对学习c ++的兴趣。该类型是int和float数据的指针类型。这是一个回答问题的小例子(如何打印出这些值):

float* a =  new float(5.8);

指针建立,指向存储值为5.8的浮点数的存储位置。

std::cout << *a;

a之前的星号被称为取消引用指针,这是数据的访问方式,您可能需要检查以确保您有一个有效的指针或您的程序可能崩溃。

delete a;

删除不再使用时分配的内存(编辑2),这将释放存储空间(不这样做会导致内存泄漏)

编辑1: 考虑指针可能指向浮点数或int的连续数组(这比一个更可能),然后您必须知道您正在读取的数组的大小以访问元素。在这种情况下,您将使用operator []访问成员,假设我们有一个数组b,

float* b = new float[2] {0.0,1.0};

要打印它的成员,您必须访问每个元素

std::cout << b[0] << ' ' << b[1];

对于数组

,delete运算符如下所示
delete[] b;

编辑2: 每当您使用new来动态分配内存时,请考虑变量的范围,当范围结束时删除指针。用户是正确的,您不想删除稍后可能使用的指针,也不需要调用删除从引用中获取的指针。

答案 1 :(得分:0)

首先,您正在使用调试器。这太棒了。使用调试器可以在五分钟内解决的SO问题数量惊人。你已经远远超过了游戏,而不是浪费时间的许多令人讨厌的麻烦,他们无法使用编译器附带的咒骂删除工具。

其次,一些重要的阅读因为它解释了正在发生的事情的一部分:What is array decaying?

现在分解调试器向您显示的内容

  

得分0x002ff5c8 {96.0000000}浮动*

得分:显然是变量的名称

浮动* scorefloat *类型的变量,a pointerfloat

0x002ff5c8 :这是score的数据值。指针是对内存中位置的引用。他们不是数据,而是指向数据。所以指针是一个变量,它包含在哪里找到另一个变量的地址。 002ff5c8是内存中的十六进制位置,您可以在其中找到score指向的内容。

{96.0000000} score指向已设置为96的浮点值(possibly plus or minus some fuzziness because not all numbers can be exactly represented with floating point

所以疯狂的数字0x002ff5c8告诉程序在哪里找到score的数据,这个数据恰好是96.

请注意,调试器仅向您显示score数据数组中的第一个值,这会将我们带回数组衰减。程序知道score指向多少数据的可能性很大。可以是一个float。可能是一百万。一旦阵列衰减,你必须携带一个数组块的长度。