c++中大于零的指针,这意味着什么

A pointer greater than zero in c++, what does mean?

本文关键字:意味着 什么 指针 大于 c++      更新时间:2023-10-16

我在c++中遇到了一个问题。我读了一些代码,但指针的用法非常固定。代码如下:

   double* marginalProbability =
   new double [10 * sizeof(marginalProbability[0])];
   memset( marginalProbability, 0, 10 * sizeof(double) );
    //................
            //.................
   if(marginalProbability>0)
        printf("larger");
   else
        printf("smaller");

我要问的问题是if(marginalProbability>0)是什么意思。它是一个大于零的指针。我认为在一个普通的编译器中,没有等于零的地址。或者这还有其他含义吗?否则,这句话似乎毫无意义。谢谢

我认为这是一个错误,原作者的意思是:

if(marginalProbability[0]>0)
        printf("larger");
   else
        printf("smaller");

如果他们已经无条件地调用了memset(),我不明白他们为什么要测试marginalProbability是否有效。此外,单词较大较小的使用表示值的比较,而不是指针。

NULL指针被视为零。话虽如此,这段代码可能只是错误的,因为比较是肯定的(因为如果指针为NULL,memset就会崩溃)。

在这种情况下,0被解释为空指针常量。

您可以比较两个指针,但结果是未指定的,除非它们指向同一数组的两个元素;从而使得代码格式良好但毫无意义。

我怀疑代码应该将概率值*marginalProbabilitymarginalProbability[i]与零进行比较。如果它是为了检查分配是否成功,那么它是错误的,原因有三:

  • 它将不得不使用!=,因为>的结果是未指定的
  • 则必须在CCD_ 10之前完成
  • 只有在分配使用CCD_ 11的情况下才是必要的;普通new在失败时抛出std::bad_alloc

值为零的指针是空指针。一个指向任何东西的指针。检查它是否为零(p!=0更常见于p>0,尽管p!=nullptr是最正确的)意味着它不是null。

您列出的代码也是错误的。如果新操作失败,它将不会返回空指针,而是抛出一个不会被捕获的异常。

这就是它应该有的样子。

try{
    std::vector<double> marginalProbability (10, 0.0);
}catch(const std::bad_alloc& e){
    std::cerr << "no memory" << std::endl;
}

有一些指针是0。它们显式地是"null"指针,不指向当前有效的对象。然而,在这种情况下使用</>是没有意义的——例如,没有1指针这样的东西。

另外,这是C代码假装成C++。

正如其他人已经提到的,这是一个bug。这个bug的一个更微妙的变体可以在这里找到:指针和整数之间的警告比较。

现代gcc(13.1)在以下方面出错:

:7:9:错误:ISO C++禁止在指针和之间进行比较整数[-fpermission]7 |如果(y>5){|~^~编译器返回:1

较旧版本的gcc可能需要-Wextra:

选项-Wextra还打印以下内容的警告消息案例:

A pointer is compared against integer zero with <, <=, >, or >=.