VC ++中的null int值

时间:2010-07-15 12:12:05

标签: visual-studio-2008 visual-c++

我想在我的程序中找到一个条件,查找数组中是否有值。通常,数组将以4个值存档。在极少数情况下,它充满了6.我想使用if语句,如果exam​​pleArray [5]不等于null,请执行此操作

像...一样的东西。

例如。 !如果(数组[5] - >等于(NULL){         //做东西     }

问题是我不能使用0,因为int很可能是0并且我不希望在这种情况下执行代码(// do stuff)。 该程序的基础围绕一个2D数组,一个非常常见的位置包含一个0 int

因为我正在网上阅读我发现0对于整数是0。

如何在不使用0的情况下找到null?

7 个答案:

答案 0 :(得分:5)

您可以使用std::vector方法,而不是使用数组。这使写if条件变得微不足道。

答案 1 :(得分:1)

你能做的不是直接存储整数,而是创建一个存储整数和初始化标志的小类。因此,当创建对象时,它是未初始化的。当它被分配时,它将被初始化为一个值。这将是最好的方式,你也可以只用一些值来填充数组,你肯定不会像static const int NOT_INITIALIZED = -99999999或其他东西那样对它进行测试。

答案 2 :(得分:1)

是的,信号值很难提出。当你谈论非指针时,NULL并没有什么特别之处。同样难以找到一个意味着“没有日期”的日期或一个意味着“没有字符串”但不是空字符串的字符串。这就是为什么在数据库编程之外使用信号值很少的原因,其中id和key的正整数的流行使得-1成为一个方便的信号值。

我认为你有三个选择。一,在您的数组中存储指针。空指针与指向值为零的整数的指针不同。但是这会产生开销(使你需要的存储空间增加一倍)并且可能会弄乱你的头脑或其他人的头部。二,使用你自己的类来表示这个东西,让一个类成员保持是否有4或6或任何值,并在你的if语句中使用该成员。三,使用随时可用的grow-self-when-you-one-one容器(如std::vector)并在if语句中使用其属性(例如size())。这样做的缺点是您需要重写访问数组元素的代码。所以我会投票给#2门。

答案 3 :(得分:0)

你有几个选择。

你可以在数组中存储'int *'(使数组本身int**)。这会增加额外内存管理的开销,但可以明确地存储NULL。我不建议这样做。

更好的想法是打破STL。我想,std::vector会很完美。您可以动态更改它的大小,而不必存储sentinel值(或NULL)。

答案 4 :(得分:0)

谈论一个包含4或5个元素的数组,我猜你没有内存大小问题。为什么不在数组中为计数器保留一个位置?这将是一个“穷人的矢量”解决方案。理想情况下,人们会在数组中使用位置0作为计数器,但是如果你有很多代码相信从0开始的索引,你可以把你的计数器放在另一端,比如6或7位。数组将包含数组中保存的项目数。

声明“未初始化”值并搜索数组是可行的,但这是一个相当不优雅的解决方案。首先,循环和搜索的成本比单纯查看单个值要长。

理想情况下,该计数器甚至不应该在您的数组中;它应该在一个单独的变量中(我们再次接近其他人建议的Vector类)。但是将它放在数组中可能会使更简单。只要注意是否有可能在数组中存储超出预期的值并踩踏你的计数器!

答案 5 :(得分:0)

行。我想在这里说清楚的第一件事是 C ++数组没有长度。他们可能有一个分配的大小,但没有办法以编程方式计算出来那是什么根据定义,C ++数组中的每个元素都有一个值。它可能是垃圾(如果你还没有初始化它),但它就在那里并且可以访问。哎呀,你甚至可以访问阵列外的元素。您的操作系统可能会阻止您,但C ++不会。

如果您希望阵列具有逻辑大小(跟踪“in”中的数据量),您有三个真正的选择:

  • 使用哨兵值自行完成。选择一些永远不会合法地出现在数组中的值,并使用它来表示“数据结束”。如果你这样做,你必须小心地声明(或分配)一个足够大的数组,以容纳你可能想要的所有数据,再添加一个哨兵的数据。你还必须非常小心地记住保持哨兵的最新状态,否则你会很快崩溃。弄清楚长度需要遍历整个数组,所以它可能很慢(假设你没有弄乱一些东西,它会终止)。这是C字符串采用的方法。
  • 使用单独的长度变量自行完成。只要您记得保持最新的长度,这将非常有效。如果你搞砸了,你很可能会得到微妙的错误而不是壮观的崩溃,但这有其缺点。此外,您必须将数组传递给所有子例程。最大的问题是,如果你使用下面的方法,C ++几乎会为你做这个,所以编写所有额外的代码来手动完成它是有点愚蠢的。
  • 使用std::vector代替哑数组。这为您提供了数组的所有优点,以及容器的所有优点,而无需跟踪逻辑的所有工作并分配长度。如果你没空房,它甚至会为你重新分配数组!这里唯一真正的缺点是,由于它看起来非常像数组,因此很容易忘记必须使用.push_back().pop_back()等例程来更改其逻辑大小。

答案 6 :(得分:0)

基本问题是C ++没有空值。有空指针值,但这些不是一回事。

表示字符串上还有空终止,但这也是不同的。

根据其设计理念,无法一般地指定适用于C ++的null值。 null值必须是某种不允许的值,或者必须有某种外部标志 - 换句话说,为了使用变量必须引用多余的内存。对于需要效率的低级语言来说,两者都不令人满意。

指针值可能会比进程实际使用的更多,因此要求指定的错误值通常没有坏处。它不一定是全位零,尽管这是最常见的情况;零只是指针的名称。 (是的,我期待nullptr。)同样,文本编码不会对字符使用整个可能的值范围,因此保留一个绝对不是字符的字符就足够了。这不适用于数字或所有值都有效的任何其他类型的数据。