C: void 指向 char[] 类型结构成员的指针

C: void pointer to struct member of type char[]

我有这个class

struct person {
    char name[100];
    int age
};

然后这个数组:

struct student people[] = { {"bill", 30}, {"john", 20}, {"bob", 11} };

然后我想写一个可以传递给 qsort 的函数;像这样的函数:

int compare_name(const void *a, const void *b);

通常情况下,例如有这样一个字符串数组时

char names[5][10] = { "xxx", "uuu", "ccc", "aaa", "bbb" };

我可以像这样使用 const void * aconst void *b

int compare_name(const void *a, const void *b) {
    for (; *( char*)a == *(char *)b; a++, b++)
        if (*(char *)a == '[=14=]') return 0;
    return *(char *)a - *(char *)b;

但是我如何编写相同的方法,即如果我想对数组进行排序,我如何告诉 C void 指针指的是 struct person 的字段 name按字母顺序排列?

最终,我需要能够像这样调用 qsort

int npeople = sizeof(class) / sizeof(struct student);
qsort(people, npeople, sizeof(struct person), compare_name);

但如前所述,我无法将 const void *a 转换为所需的值 (person->name),就像我在简单地处理字符串数组时对 *( char*)a 所做的那样。

非常感谢您的帮助!

I have this class

 struct person {
     char name[100];
     int age }; 

and then this array:

struct student people[] = { {"bill", 30}, {"john", 20}, {"bob", 11} };

您的代码中有很多拼写错误,例如 struct personstruct student 是不同的类型说明符。而C中没有类与C++相对的

尽管如此,比较函数可以如下所示

#include <string.h>

//...

int compare_name( const void *a, const void *b )
{
    const struct person *p1 = a;
    const struct person *p2 = b;

    return strcmp( p1->name, p2->name );
} 

还要注意像这样的增量操作 a++, b++ 没有为类型 c/v void * 的指针定义,尽管一些编译器可以有自己的语言扩展,这与 C 标准相矛盾..