cpp中指针的类型转换

typecasting of pointers in cpp

谁能告诉我以下代码是怎么回事:

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有什么用?

Point *p1 = (Point *)a, *p2 = (Point *)b;

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

int a = 2, b = 3;

对于指针,* 保持在变量附近。下面会给你一个 int * 和一个 int:

 int *a = nullptr, b = 2;

https://cdecl.org


what's the use of FLT_MAX here?

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

FLT_MAX是定义的常量here 以及如果用于查找数组中所有点对之间距离最短的点的逻辑,将变量 min 设置为 FLT_MAX 的想法是定义一个可以超过的阈值限制值第 1 2 点的第 1 比较...

您的第一个代码片段中的 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);
}