【问题标题】:pointer to function in a struct in C指向 C 结构中函数的指针
【发布时间】:2021-01-26 23:45:16
【问题描述】:

我需要创建一个包含 1 个 int、2 个 char、1 个 float 的结构和(我写了练习中的行):“用于读取数据的函数的两个指针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;
    ??
};

【问题讨论】:

  • "我不明白 read*write* 是什么" - 恐怕这是无效的语法。指针应类似于void (*read)(student*)
  • void (read*)(student*st) 正如你所说的,这似乎是一个错字。应该是void (*read)(student*st)。并且被要求在 C 代码中使用 cin 是没有意义的。询问你的导师。
  • 这里批准的答案中有一个很好的解释:stackoverflow.com/questions/840501/…
  • 是的,您的说明似乎有错字。我建议你问你的导师或助教澄清。
  • 如果练习显示void (read*)(student*st),它有一个错误。那不是合法的 C 语法。正如您实际上或多或少在问题中所写,正确的语法是void (*read)(student*st)

标签: c function pointers


【解决方案1】:

以下代码示例有什么问题?我只添加了一个函数指针(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;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 2016-08-25
    相关资源
    最近更新 更多