![](http://cn.qzs.qq.com/qzone/em/e113.gif)
![](http://cn.qzs.qq.com/qzone/em/e113.gif)
请记住!没有简单的程序,只有头脑简单的程序员!!
![](http://cn.qzs.qq.com/qzone/em/e130.gif)
我们学过C语言的人都知道,指针是C语言的精髓,会了指针也就真正掌握了C的精髓,鉴于在开发过程和学习过程中,不少学C的伙伴会把这几个概念混淆,进而在程序运行的时候产生“段错误”导致程序崩溃。接下来我们来看看这几个概念:
1.指针函数
2.函数指针
3.函数指针数组
4.指向指针函数的函数指针数组
1、什么叫指针函数?
顾名思义就是返回值为指针的函数.
举个例子,我们在学字符串操作的时候不知道是否有印象?
Char *strcpy(char *dest , char *src);
char *strcat(char *dest, const char *src);
…
这就是所谓的指针函数呀!不知道大家是否有动手实现过这两个程序,实现过的那一定印象是非常深刻的,其中一个是字符串拷贝函数,另一个是字符串粘贴函数,实现起来也是非常简单的!
char *strcpy(char *dest, const char *src)
{
char*tmp = dest;
while((*dest++ = *src++) != '\0')
returntmp;
}
char *strcat(char *dest, const char *src)
{
char*tmp = dest;
while(*dest)
dest++;
while((*dest++ = *src++) != '\0');
returntmp;
}
2、什么叫函数指针?
顾名思义就是一个指针指向了函数,这类函数也称作回调函数。
举个例子:
void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
这个函数,可以实现快速排序。
它的第四个参数就是一个函数指针,用于确定排序的顺序.
学过UNIX环境高级编程的也知道,有一个函数,
int pthread_create (pthread_t * thread_id, __const pthread_attr_t * __attr,
void *(*__start_routine) (void *),void *__restrict__arg);
创建线程,这个函数的第三个参数也是一个函数指针,利用操作系统时间片的机制可以实现两段程序同时跑,也就是实现了void *do_thread();这样的一个函数。
3、什么叫函数指针数组?
顾名思义就是数组的元素中有函数指针指向了一个函数.详情看代码分析。
4、指向指针函数的函数指针数组
顾名思义就是数组的元素中有函数指针指向了一个指针函数.详情看代码分析。
好了,概念咱们弄明白了,接下来上代码!!!
#include<stdio.h>
int add(int a, int b) ;
int sub(int a, int b) ;
int *mux(int*a) ;
char *strcpy(char*dest , char *src) ;
int main(void)
{
int a = 3 , b = 5 ;
int i ;
int ret ,ret1 , ret2 , ret3;
int *c ;
//定义一个指针
char *buffer = "hello world!" ;
char buf[20] ;
//将buffer里的hello world拷贝到buf里去,用自己实现的strcpy
strcpy(buf , buffer);
//函数指针数组
int (*funcp[2])(int , int) ;
//把函数add的入口地址赋给funcp这个数组的第0个元素
funcp[0] = add ;
//把函数sub的入口地址赋给funcp这个数组的第1个元素
funcp[1] = sub ;
//指向指针函数的函数指针数组
int *(*funcp1[1])(int *) ;
funcp1[0] = mux;
//定义一个函数指针
int (*p)(int , int) ;
int (*q)(int , int);
//p指向add这个函数的入口地址
p = add ;
//q指向sub这个函数的入口地址
q = sub ;
ret = p(a , b);
ret1 = q(a , b);
printf("指针函数:\n");
printf("buf:%s\n",buf) ;
printf("普通的函数传参调用:\n");
printf("ret = %d\n",ret);
printf("函数指针的传参调用:\n");
printf("ret1 = %d\n",ret1);
printf("函数指针数组调用:\n");
for(i = 0 ; i < 2 ; i++){
ret2 = funcp[i](a , b) ;
printf("ret2 =%d\n",ret2);
}
printf("指向指针函数的函数指针数组:\n");
for(i = 0 ;i < 1 ; i++)
{
c = funcp1[i](&b);
printf("c = %d\n",c);
}
return 0 ;
}
int add(int a, int b)
{
return a + b ;
}
int sub(int a, int b)
{
return a - b ;
}
int *mux(int*a)
{
return *a ;
}
char*strcpy(char *dest , char *src)
{
char *tmp = dest;
while ((*dest++ = *src++) != '\0')
/* nothing */;
return tmp;
}
执行结果:
看完了代码的注释,相信大家也基本了解了这四类模糊不清概念的用法。指针其实并没有想像中那么可怕,我这里只是举了4个概念,还是指针里非常皮毛的东西,因为我本身还是个菜鸟!
其实还有指向结构体的指针,数组指针,指针数组,更变态的,二级指针指向各种,或者是多级指针等等!!!当然啦,指针的用法还有很多灵活的地方,我也正在学习中。好了,今天就到这里了,如果开发中有遇到的,改天有机会我再写写分享出来!
我的CSDN博客: http://blog.csdn.net/morixinguan/article/month/2015/12