C语⾔结构体中定义函数指针详解
也欢迎⼤家转载本篇⽂章。分享知识,造福⼈民,实现我们中华民族伟⼤复兴!
在学习嵌⼊式我们经常和结构体函数指针打交道,还有链表,环形缓冲区之类的,这⾥中点讲解结构体中定义函数指针。下⾯这个程序你看⼀遍你基本也明⽩⽤法了。
下⾯是我写的⼀个很简单的程序struct.c
#include <stdio.h>  /* 标准输⼊输出头⽂件 */
#include <stdlib.h> /* strtoul⽤到的头⽂件 */
struct test_pfun                                          { /* 定义⼀个结构体,⾥⾯有三个成员,是三个函数指针 ,前⾯千万不要加static,这⾥并没有分配内存*/
int (*add) (int a,int b);
int (*sub) (int a,int b);
int (*mult) (int a,int b);
};
static int  test_add(int a,int b)  /* 定义求和函数 */
{
return (a+b);
}
static int  test_sub(int a,int b)  /* 定义相减函数 */
{
return (a-b);c语言struct头文件
}
static int  test_mult(int a,int b)  /* 定义乘法函数 */
{
return (a*b);
}
struct test_pfun pfun={    /* 关键的地⽅时在这⾥,看怎么函数指针赋值 */ .add  =test_add,
.sub  =test_sub,
.mult  =test_mult,
};
/*
*  usage:
*  ./a.out num1 num2
*/
void print_uage()
{
printf("./a.out <num1> <num2>\n ");    /* 打印⽤法 */
}
int main(int argc,char **argv)
{
int a ,b;
if(argc!=3)
{
print_uage();
return -1;
}
a=strtoul(argv[1],NULL,0);    /* 把字符串argv[1]转换成⼀个整数a */
b=strtoul(argv[2],NULL,0);  /* 把字符串argv[2]转换成⼀个整数b */
/* 不懂strtoul命令的请点击这⾥: */
printf("a+b=%d\n",pfun.add(a,b));
printf("a-b=%d\n",pfun.sub(a,b));
printf("a*b=%d\n",pfun.mult(a,b));
return 0;
}
下⾯我在讲⼀下结构体的⼀些基本⽤法:
形式1:先定义结构体类型,再定义变量
struct结构体标识符
{
成员变量列表;…
};
struct 结构体标识符 *指针变量名;
变量初始化⼀:struct结构体标识符 变量名={初始化值1,初始化值2,…, 初始化值n };
形式2:在定义类型的同时定义变量
struct结构体标识符
{
成员变量列表;…
} *指针变量名;
形式3:直接定义变量,⽤⽆名结构体直接定义变量只能⼀次
struct
{
成员变量列表;…
}*指针变量名;
其中“指针变量名”为结构体指针变量的名称。形式1是先定义结构体,然后再定义此类型的结构体指针变量;形式2和形式3是在定义结构体的同时定义此类型的结构体指针变量
最后我在举⼀个驱动中的典型例⼦:
struct button_irq_desc {  /* 定义⼀个结构体,只是定义这种类型。再次强调前⾯不要加上static ,现在还没有分配内存 */
int irq;
unsigned long flags;
char *name;
};
/* ⽤来指定按键所⽤的外部中断引脚及中断触发⽅式, 名字 */
static struct button_irq_desc button_irqs [] = {    /* 定义⼀个button_irq_desc结构体类型名字button_irqs的4元数组,这⾥就可以加上上static ,你定义变量当然得分配内存空间 */
{IRQ_EINT19, IRQF_TRIGGER_FALLING, "KEY1"}, /* K1 */
{IRQ_EINT11, IRQF_TRIGGER_FALLING, "KEY2"}, /* K2 */
{IRQ_EINT2,  IRQF_TRIGGER_FALLING, "KEY3"}, /* K3 */
{IRQ_EINT0,  IRQF_TRIGGER_FALLING, "KEY4"}, /* K4 */
};
request_irq(IRQ_EINT0,  buttons_irq, IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING, "S2", &pins_desc[0]);
struct pin_desc * pindesc = (struct pin_desc *)dev_id;    /* 强制转换成struct pin_desc *指针,这⼉是
驱动程序的⽤法 ,看不懂没有关系*/
这⾥我们还可以定义结构体指针对数组操作:
static struct button_irq_desc    *p_irq_desc=button_irqs;  /* 结构体数组的⾸地址 */
使⽤数组中其他选项时候,只需让p_irq_desc这个地址加⼀,这⾥加⼀等于地址加上sizeof(p_irq_desc)。
给我⽼师的⼈⼯智能教程打call!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。