簡體   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