【问题标题】:Casting Void Pointers in C Programming [closed]在 C 编程中强制转换 void 指针
【发布时间】:2018-01-22 04:12:15
【问题描述】:

我正在阅读一本名为 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 是指向指针的指针,但在右侧,我完全不知道发生了什么。我们是在对指针进行赋值吗?

还请解释一下关于退货线路的一切。

**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?**

【问题讨论】:

标签: c pointers casting void


【解决方案1】:

那么简单的事情就在这里,即使你没有在这 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;

返回行基本上是返回两个字符串比较的结果——根据比较的值可能会导致-110。这可以用作标准库排序qsort的比较器函数。

【讨论】:

    猜你喜欢
    • 2016-08-29
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 2018-03-05
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多