在 C 编程中转换 Void 指针

Casting Void Pointers in C Programming

我正在读一本名为 head first c 的书,他们告诉我一个关于转换指针的概念。我明白为什么我会这样做,但我想知道的是如何去做?比如语法是什么?

int compare_names(const void* a, const void* b) 
{
    const char** sa = (const char**)a;
    const char** sb = (const char**)b;
    //why would, in the return section, we use normal pointers instead of **?
    return strcmp(*sa, *sb);
}

我知道在左侧我们使用了 2 个星号,因为 sa/sb 是指向指针的指针,但在右侧,我完全不知道发生了什么。我们是在从指针到指针赋值吗?

另请解释有关 return 行的所有内容。

**One final question I have is when I write the a statement like (char*)a or (int*)a am I making "a" into an integer or a char?**

好吧,简单的事情就在这里,即使你没有在这 2 个语句中使用转换,你也可以继续

char** sa = (char**)a;
char** sb = (char**)b;

因为从 void*char** 的转换是隐式的。这也很好(前提是您将其分配给正确限定的变量名)。

const char** sa = a;

问题是,这里我们需要做这个(赋值),以便 ab 中包含的地址被视为 char** 并使用它们的解引用值在 strcmp。您也可以选择这样做

return strcmp(*((const char**)sa), *((const char**)sb));

不使用任何额外的变量。

同样更重要的是,需要注意的一件事是 - 这里您违反了由于在参数中使用 const 而存在的约束。你会很高兴去

const char** sa = (const char**)a;
const char** sb = (const char**)b;

return 行基本上是 return 比较两个字符串的结果——这可能导致 -110基于比较值。这可以用作标准库排序 qsort.

的比较函数