您的位置:首页 > 其它

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);



这就是所谓的指针函数呀!不知道大家是否有动手实现过这两个程序,实现过的那一定印象是非常深刻的,其中一个是字符串拷贝函数,另一个是字符串粘贴函数,实现起来也是非常简单的!

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: