新闻中心

EEPW首页 > 嵌入式系统 > 牛人业话 > C语言的一些高级议题

C语言的一些高级议题

作者:areak时间:2014-10-23来源:电子产品世界收藏

  的灵魂,我们经常听到这样的说法,当我们初学的时候,似乎觉得也没有什么,但是当你越来越深入的了解它,你就会发现的强大有时甚至超乎你的想象。C语言作为一种相对较为底层的语言,在某些方面有着不可替代的优势。因此,要学好C语言,要深入,要精通。

本文引用地址:http://www.eepw.com.cn/article/264327.htm

  C语言之回调

  先来看下的的基础知识,,顾名思义,就是指向函数的指针,声明方法如下:

  int func(int); //函数原型

  int (*pfunc)(int) = & func; //创建函数指针pfunc,并指向函数func

  这里的&操作符可有可无,因为函数名本身就是一个地址。

  回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。在我们想通过一个统一接口实现不同的内容时,用回调函数非常合适。

  例如:有如下用于不同设备的显示函数

  Void A_show(); Void B_show(); Void C_show();

  Void show(void (*ptr)());

  使用时我们就可以将函数作为参数

  show(A_show);

  再举一个经典的例子,实现在一个单链表中查找一个值。

  Node *

  Search_list(Node *node,int const value)

  {

  While(node!=NULL){

  if(node->value == value)

  break;

  node = node->link;

  }

  return node;

  }

  这个函数只适用于值为整形的链表,因为value的值为int型,如果此时你需要在一个字符串链表中查找,需要编写另外的函数来实现。这时就用到了回调函数,使查找函数与类型无关,这样就能用于任何类型的值的链表。

  Node *

  Search_list(Node *node,void const value,

  int (*compare)(void const * ,void const *))

  {

  While(node!=NULL){

  if(compare(&node->value,value)==0)

  break;

  node = node->link;

  }

  return node;

  }

  int compare_ints(void const *a, void const *b)

  {

  if(*(int*)a == *(int *)b)

  return 0;

  else

  return 1;

  }

  我们在使用Search_list函数时,你已经知道要查找数据的数据类型了。用法如下:

  Desired_node = Search_list(root, &desired_value,compare_ints);

  那如果你要在一个字符串链表中查找呢?首先你要在定义用于比较字符串一个函数:

  int compare_chars(void const *a, void const *b)

  {

  if(*(char*)a == *(char *)b)

  return 0;

  else

  return 1;

  }

  当然你不必这样来写,因为C语言函数库里面有这样的函数

  strcmp( const char *string1, const char *string2 );

  所以你就可以直接使用下面的代码来实现在字符串链表中查找字符值的功能

  Desired_node = Search_list(root, &desired_value, strcmp);

  这样,可以不必修改Search_list函数,而使得Search_list函数的功能更加通用。

c语言相关文章:c语言教程



上一页 1 2 下一页

关键词: C语言 指针 函数

评论


相关推荐

技术专区

关闭