Linux内核指针函数,Linux内核 指针函数和函数指针

首先,要区分函数指针和指针函数。函数指针和指针函数从语文的角度看,应该算是一个偏正短语,函数指针说明是一个指针,而指针函数说明是一个函数;其是什么样的指针、什么样的函数,我们先暂且不论。明确函数指针是指针,指针函数是函数,这才是最重要的。

首先,要区分函数指针和指针函数。函数指针和指针函数从语文的角度看,应该算是一个偏正短语,函数指针说明是一个指针,而指针函数说明是一个函数;其是什么样的指针、什么样的函数,我们先暂且不论。明确函数指针是指针,指针函数是函数,这才是最重要的。下面在来看这是一个什么样的指针、什么样的函数。

1.指针函数

指针函数就是返回值为指针的函数,就这么简单,其具体定义为:

类型名 *函数名(参数列表)

其中,括号“()”表示这是一个函数,其运算符“*”表示此函数为指针型函数,其函数返回值为指针,“类型名”表示函数返回的指针所指向的类型。 我们注意到,指针函数的定义和普通函数的定义差不多,只不过在普通函数定义的函数名前加上“*”就变为相应的指针函数了。

“(参数表列)”在调用语句中,即使函数不带参数,其参数表的一对括号也不能省略。其示例如下:

int *func(int, int)

由于“*”的优先级低于“()”的优先级,因而func首先和后面的“()”结合,也就意味着,func是一个函数。接着再和前面的“*”结合,说明这个函数的返回值是一个指针。由于前面还有一个int,也就是说,func是一个返回值为整型指针的函数。

2.函数指针

函数指针是指向函数的指针变量,因此其实指针变量,只不过这个指针变量是指向某个函数,就如同指针变量可以指向整型、字符型等,仅此而已。C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样。

这里我们要记住函数指针的两个用途:调用函数和作为函数的参数。这两个用途对于分析复杂的指针函数有很大的指导作用。其具体定义为:

函数类型 (* 指针变量名) (形参列表)

“函数类型”说明函数的返回类型,“(标志符 指针变量名 )”中的括号不能省,若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。“形参列表”可有可无,视情况而定。其示例如下:

int func(int x); /* 声明一个函数 */

int (*f) (int x); /* 声明一个函数指针 */

f=func; /* 将func函数的首地址赋给指针f */

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

这里看一个复杂一点的例子:

int (*ff(int))(int *, int);

我觉得这里只需要说明一点,这里的指针不是一个我们所理解的简单变量,这里的函数指针是一个由指针函数返回的指针来充当的;ff首先与后面的“()”结合,接着与前面的“*”结合,说明ff函数的返回值是一个指针,即:int (*(ff(int)))(int *, int)。就像普通指针和指针函数返回的指针的关系那样。只要理解这一点,我觉得这个例子就很好理解了。

linux内核中例子:void (*signal (int signr,void (*handler)(int))) (int)

这里的void (*handler)(int))的用途是作为函数参数,这里面相当于函数指针嵌套函数指针,(*signal (int signr,void (*handler)(int))) 是指针函数的返回值充当函数指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值