设为首页 加入收藏

TOP

指针和数组的掌握以及内存的管理(二)
2016-05-01 02:25:03 】 浏览:709
Tags:指针 掌握 以及 内存 管理
har* 类型的形参 p1,p2,函数返回值char *。

char * *fun2(char *p1,char *p2);

这里函数为fun2,两个char 类型的形参 p1,p2,函数返回值char **

char *(*fun1)(char * p1,char *p2);

在这,我们就可以用优先级来进行判断,它先于()结合,可以知道fun1是一个指针,然后它指向的是一个函数。而这个函数呢,就是一个有两个char* 类型的形参 p1,p2,函数返回值char *的函数。

函数指针的使用
例:
#include
   
     int max(int x,int y) { return (x>y x:y); } int main() { int (*ptr)(int, int); int a, b, c; ptr = max; scanf("%d%d", &a, &b); c = (*ptr)(a,b); printf("a=%d, b=%d, max=%d", a, b, c); return 0; }
   

在这一段程序中,ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数。

接下来看下一个例子:

void fun()
{
    printf("CALL Fun!\n");
}
int main()
{
    void (*p)();
    *(int *)&p=(int)fun;
    (*p)();
    return 0;
}

分析:
void (*p)():这一句说的就是我在这里定义了一个指针变量p,p用来指向函数,函数的返回值和参数都是void类型的。
*(int )&p=(int)fun:在这,就是说将fun函数的地址强制转换成int类型,然后赋给了p指针变量。
(*p)():表示对函数fun进行调用。
所以我们要清楚,函数指针还是一个指针,里面存放的是函数的首地址,然后我们通过首地址来调用函数。

delphi">(*(void (*)())0)();

这个是什么呢?

对于这个,其实咱们也可以通过分析进行解决。
void (*)():这个是一个void类型的一个函数指针,这个函数返回值为空,并且参数也为空。
(void (*)())0:这个就是将0强制转换成这个函数指针的类型,也就是说一个函数保存在首地址为0的一段区域。
(* ( void (*)())0):这是取得首地址为0的的内容,就是保存在首地址为0的的函数。
(* (void (*)())0)():这是最终对这个函数进行调用,因为函数的参数为空,所以调用时参数也是空的。

接下来我们再进行分析一个类似的:

(*(char * *(*)(char **,char **))0)(char * *,char * *);

是不是看这有些晕呢,咱们继续一层一层进行分析。
char * * ( * )(char * * ,char * * ):这个所说的就是一个函数指针,这个函数指针指向返回值为char * * * ,参数为两个char * *的参数。
(char * * ( * )(char * * ,char * * ))0:这是将0强制转换为这个函数指针的类型,也就是说一个函数保存在首地址为0的一段区域。
( * (char * * ( * )(char * * ,char * * ))0 ):这是取得首地址为0的的内容,就是保存在首地址为0的的函数。
( * (char * * ( * )(char * * ,char * * ))0)(char * * ,char * * ):这是最终对这个函数进行调用因为函数的参数为(char * * ,char * * ),所以调用也是给(char * * ,char * * )参数。

函数指针数组


函数指针数组:我们也可以参考前面的分析方法,它是一个数组,这个数组中的元素就是我们前面所提到的函数指针。

char *(* p[3])(char *p);

上面这个就是一个函数指针数组,首先它是有3个元素的一个数组,里面存放的是指向函数的指针,这些指针指向一些返回值类型为指向字符的指针。
在这里的关键你要知道这个是数组,数组中的元素是函数指针。

函数指针数组指针


到这里,我想许多人看见以后肯定非常晕了,一层套一层的,其实,没什么复杂的,万变不离其宗,咱们还是一层一层来进行分析。
首先给出一个函数指针数组指针

char *(*(*p)[3])(char *p);

在这里,首先按照优先级从个最里面看,最里面的(*p)这是一个指针。
(*( *p)[3])这个说了这个指针是指向含有三个元素的数组的指针。
char*( *(*p)[3])(char *p)这个说了这个数组中存放的元素是3个函数指针,这些指针指向一些返回值为指向字符的指针。然后这个函数的参数是指向字符的指针。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇编写高效的C程序与C代码优化 下一篇青蛙跳台阶

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

最新文章

热门文章

C 语言

C++基础

windows编程基础

linux编程基础

C/C++面试题目