【问题标题】:typecasting of pointers in cppcpp中指针的类型转换
【发布时间】:2020-08-26 16:05:25
【问题描述】:

谁能告诉我下面的代码发生了什么:

int compareX(const void* a, const void* b)  
 {  
    Point *p1 = (Point *)a, *p2 = (Point *)b;  
    return (p1->x - p2->x);  
 }

我从极客那里获取此代码,最近的一对点。任何人都可以通过逐行解释以更简单易行的方式向我解释类似的代码

另外,我也无法理解这段代码:

float bruteForce(Point P[], int n)  
{  
    float min = FLT_MAX;
    for (int i = 0; i < n; ++i)  
        for (int j = i+1; j < n; ++j)  
            if (dist(P[i], P[j]) < min)  
                min = dist(P[i], P[j]);  
    return min;  
}  

FLT_MAX在这里有什么用?

【问题讨论】:

标签: c++ floating-point void-pointers typecasting-operator


【解决方案1】:

FLT_MAX 是一个常量定义here 如果用于查找数组中所有点对之间距离最小的点的逻辑,则使用 FLT_MAX 设置变量 min 的想法是定义一个阈值限制值,该阈值限制值可以被第一次比较第一个 2 分...

【讨论】:

    【解决方案2】:
    Point *p1 = (Point *)a, *p2 = (Point *)b;
    

    这一行在同一行初始化两个变量。喜欢

    int a = 2, b = 3;
    

    对于指针,* 保留在变量附近。以下将为您提供int *int

     int *a = nullptr, b = 2;
    

    https://cdecl.org


    FLT_MAX 在这里有什么用?

    一切都小于FLT_MAX。因此,在第一次比较中检查最小数量是安全的。

    【讨论】:

      【解决方案3】:

      第一个代码 sn-p 中的 compareX 函数具有签名 required 如果要在调用 standard qsort() function(或其他类似的排序例程)中作为比较器传递标准库提供)。两个指针参数必须const void* 类型给出。

      但是,当使用该函数时,代码实际上会传递指向 Point 对象的指针,因此该函数必须首先显式将它们转换为这样,以便它们可以按顺序取消引用做各自x成员的比较。

      注意:虽然在这里使用“C-Style”转换可以工作,但许多人会不赞成这种用法。使用static_cast 操作可能更符合“现代 C++”:

      int compareX(const void* a, const void* b)
      {
          const Point *p1 = static_cast<const Point*>(a), *p2 = static_cast<const Point*>(b);
          return (p1->x - p2->x);
      }
      

      【讨论】:

        猜你喜欢
        • 2020-06-15
        • 2020-11-17
        • 1970-01-01
        • 2021-09-20
        • 2020-12-24
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多