繁体   English   中英

指向C中结构中函数的指针

[英]pointer to function in a struct in C

我需要创建一个结构,其中包含 1 个 int、2 个字符、1 个浮点数和(我写了练习中的行):“用于读取数据的函数上的两个指针void (read*)(student*st)和一个用于显示的指针数据void (write*)(student*st)

我只是不明白这句话。 我知道 C 中函数指针的语法。我不明白read*write*是什么。 如果它是*read*write那么 in 将是指向函数的指针变量名称,而(student*st)是参数,指向结构的指针。

此外,在练习中似乎该程序是关于 ANSI C 的,但它要求我使用 cin 读取学生人数并使用 new 为学生数组分配内存。

我就是这样开始的。

struct student {
    int idNumber;
    char name[100];
    char gender[20];
    float mark;
    ??
};

以下代码示例有什么问题? 我只添加了一个函数指针( func_print ),但代码应该是不言自明的:

#include <stdio.h>

struct student {
    int idNumber;
    char name[100];
    char gender[20];
    float mark;
    void (*func_print)(struct student *);
};

void print(struct student *s)
{
    printf("ID    : %d\n", s->idNumber);
    printf("Name  : %s\n", s->name);
    printf("Gender: %s\n", s->gender);
    printf("Mark  : %f\n", s->mark);
}

int main(int argc, char *argv[])
{
    struct student foo = { 0, "John Doe", "Male", 1.0, &print};
    
    foo.func_print(&foo);
    return 0;
}

输出:

$ ./foo
ID    : 0
Name  : John Doe
Gender: Male
Mark  : 1.000000
$

这种技术在各种 C 程序中经常使用。 (你已经添加了C标签,没有C++标签。到目前为止,其他成员写的, std::cinnew只是C++ 。)

Linux 设备驱动程序结构(device_driver)作为真实世界的例子:

struct device_driver {
    const char      *name;
    struct bus_type     *bus;

    struct module       *owner;
    const char      *mod_name;  /* used for built-in modules */

    bool suppress_bind_attrs;   /* disables bind/unbind via sysfs */
    enum probe_type probe_type;

    const struct of_device_id   *of_match_table;
    const struct acpi_device_id *acpi_match_table;

    int (*probe) (struct device *dev);
    void (*sync_state)(struct device *dev);
    int (*remove) (struct device *dev);
    void (*shutdown) (struct device *dev);
    int (*suspend) (struct device *dev, pm_message_t state);
    int (*resume) (struct device *dev);
    const struct attribute_group **groups;
    const struct attribute_group **dev_groups;

    const struct dev_pm_ops *pm;
    void (*coredump) (struct device *dev);

    struct driver_private *p;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM