将参数复制到函数指针

标签 c function pointers

一个nice tutorial on function pointers举了一个我有疑问的例子。这是一个简单的排序函数,其参数之一是一个函数。这是函数调用。正如您所看到的 (*compar) 函数有两个“const void*”争论

void qsort(void *base, size_t nmemb, size_t size,
        int(*compar)(const void *, const void *));

稍后调用此函数:

#include <stdlib.h>
int int_sorter( const void *first_arg, const void *second_arg )
{
    int first = *(int*)first_arg;
    int second = *(int*)second_arg;
    if ( first < second )
    {
        return -1;
    }
    else if ( first == second )
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

int main()
{
    int array[10];
    int i;
    /* fill array */
    for ( i = 0; i < 10; ++i )
    {
        array[ i ] = 10 - i;
    }
    qsort( array, 10 , sizeof( int ), int_sorter );
    for ( i = 0; i < 10; ++i )
    {
        printf ( "%d\n" ,array[ i ] );
    }

}

我的问题是编译器如何知道“int_sorter”正在比较哪两个元素?它们没有在初始函数中调用,我认为这是因为作为参数调用的函数处理它们,但是那个函数如何知道在这个数组中我们正在比较这些 两个数字?

我也不知道什么*(int *)方法;我怀疑这就是答案的一部分。

最佳答案

qsort() 函数负责(重复)使用正确的两个指针调用比较器函数。它们是指向传递给 qsort() 的数组的两个元素的指针。编译器不知道 int_sorter() 正在比较哪两个元素。

first = *(int *)first_arg; 表示法将 const void * 转换为 int *,然后取消引用 >int(读取它,因此不会违反const约束),并将值分配给first。 const void * 参数表示“比较器函数不应修改指针参数指向的数据”。

qsort()的设计允许它对任何类型的数组进行排序;它需要的信息都存在于界面中。

关于将参数复制到函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18660630/

相关文章:

c - 嵌入式Linux启动和完整性监视器

javascript - 为什么在对象标记中调用函数是有效的?

javascript - href =""中的 getBaseURL() javascript 调用函数

c - 将数据文件作为链表中的节点读取的函数

c - 写入结构时出现段错误

c - 将数组传递给 scanf 函数和变量

python - 从 C Visual Studio 调用 open cv python 代码进行图像显示

符合标准的字符串是否可以超过 SIZE_MAX 个字符?

c - 这段代码是否存在某种安全问题?

C - 我可以将 char *argv[](命令行参数)表示为结构变量的字符数组吗?