2015/12/22:指针-函数-数组随笔

鉴于今天时间非常充足,早上发表了一篇对结构体的总结,快可以到睡觉的时刻了,明天要开始接着去上班,继续当我快乐的驱动程序员  ,在睡觉前再对一例知识点进行总结。内容不多,同时欢迎高手指正!!
  请记住!没有简单的程序,只有头脑简单的程序员!!  

我们学过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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值