2015/12/22:指针-函数-数组随笔
2015-12-22 23:28
260 查看
鉴于今天时间非常充足,早上发表了一篇对结构体的总结,快可以到睡觉的时刻了,明天要开始接着去上班,继续当我快乐的驱动程序员
,在睡觉前再对一例知识点进行总结。内容不多,同时欢迎高手指正!!
请记住!没有简单的程序,只有头脑简单的程序员!!
我们学过C语言的人都知道,指针是C语言的精髓,会了指针也就真正掌握了C的精髓,鉴于在开发过程和学习过程中,不少学C的伙伴会把这几个概念混淆,进而在程序运行的时候产生“段错误”导致程序崩溃。接下来我们来看看这几个概念:
1.指针函数
2.函数指针
3.函数指针数组
4.指向指针函数的函数指针数组
1、什么叫指针函数?
顾名思义就是返回值为指针的函数.
举个例子,我们在学字符串操作的时候不知道是否有印象?
Char *strcpy(char *dest , char *src);
char *strcat(char *dest, const char *src);
…
这就是所谓的指针函数呀!不知道大家是否有动手实现过这两个程序,实现过的那一定印象是非常深刻的,其中一个是字符串拷贝函数,另一个是字符串粘贴函数,实现起来也是非常简单的!
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、指向指针函数的函数指针数组
顾名思义就是数组的元素中有函数指针指向了一个指针函数.详情看代码分析。
好了,概念咱们弄明白了,接下来上代码!!!
执行结果:
看完了代码的注释,相信大家也基本了解了这四类模糊不清概念的用法。指针其实并没有想像中那么可怕,我这里只是举了4个概念,还是指针里非常皮毛的东西,因为我本身还是个菜鸟!
其实还有指向结构体的指针,数组指针,指针数组,更变态的,二级指针指向各种,或者是多级指针等等!!!当然啦,指针的用法还有很多灵活的地方,我也正在学习中。好了,今天就到这里了,如果开发中有遇到的,改天有机会我再写写分享出来!
我的CSDN博客: http://blog.csdn.net/morixinguan/article/month/2015/12
,在睡觉前再对一例知识点进行总结。内容不多,同时欢迎高手指正!!
请记住!没有简单的程序,只有头脑简单的程序员!!
我们学过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
相关文章推荐