gpt4 book ai didi

c - qSort a Struct 使用 Typedef 和 Casts,这让我完全困惑

转载 作者:行者123 更新时间:2023-11-30 17:29:02 24 4
gpt4 key购买 nike

代码如下:http://support.microsoft.com/kb/73853

/* Compile options needed: none
*
* This example program uses the C run-time library function qsort()
* to sort an array of structures.
*/

#include <stdio.h>
#include <stdlib.h>

typedef int (*compfn)(const void*, const void*);

struct animal { int number;
char name[15];
};

struct animal array[10] = { { 1, "Anaconda" },
{ 5, "Elephant" },
{ 8, "Hummingbird" },
{ 4, "Dalmatian" },
{ 3, "Canary" },
{ 9, "Llama" },
{ 2, "Buffalo" },
{ 6, "Flatfish" },
{ 10, "Zebra" },
{ 7, "Giraffe" } };

void printarray(void);
int compare(struct animal *, struct animal *);

void main(void)
{
printf("List before sorting:\n");
printarray();

qsort((void *) &array, // Beginning address of array
10, // Number of elements in array
sizeof(struct animal), // Size of each element
(compfn)compare ); // Pointer to compare function

printf("\nList after sorting:\n");
printarray();
}

int compare(struct animal *elem1, struct animal *elem2)
{
if ( elem1->number < elem2->number)
return -1;

else if (elem1->number > elem2->number)
return 1;

else
return 0;
}

void printarray(void)
{
int i;

for (i = 0; i < 10; i++)
printf("%d: Number %d is a %s\n",
i+1, array[i].number, array[i].name);
}

我不明白这种类型定义与强制转换的工作方式。我们有“typedef int”,而“(compfn)(const void, const void*)”部分我真的不明白。
(compfn)compare 不应该是compare(compfn) 吗?为什么函数 Compare 前面没有任何参数?我检查了 wiki,唯一的例子是 C++,我将在 C 之后开始 C++。在这里也没有找到太多。提前致谢。编辑:我看到你们不太活跃,我明天会睡一会儿并尝试理解它。之后我可能会制作一个教程。

最佳答案

typedef int (*compfn)(const void*, const void*);
Return type: int
Argument 1: pointer
Argument 2: pointer

int compare(struct animal *, struct animal *);
Return type: int
Argument 1: pointer
Argument 2: pointer

正如你所看到的,它们是相互兼容的,C 中的类型检查有点弱。

当您输入 (compfn)compare 时,您告诉编译器切换到另一个函数签名,即左手装箱,在本例中它确实匹配。

关于c - qSort a Struct 使用 Typedef 和 Casts,这让我完全困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25827788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com