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;
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);
}
谁能告诉我以下代码是怎么回事:
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;
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);
}