Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4263127
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: C/C++

2011-05-13 17:03:16

1.4 拥抱变化

    在写双向链表时,都会编写一个list_print函数,它的功能是在屏幕上打印出整个双向链表的数据。当我们将 专用链表 修改为 通用链表后,使用list_print函数打印数据就会很困难。
    因为:
        在专用链表中,如果链表存放的是整形,用 %d 打印,存放字符串,用%s打印
        在通用链表中,我们不知道链表要存放的是 整形 还是 字符串等等,那么我们就比较困难去实现打印数据函数了。


怎么解决呢??

    在代码实现中,因为调用使用者知道链表中的数据类型。那么,就让调用者来实现。
    通过函数指针来实现,具体做法如下:



1. 定义函数指针类型在头文件中
  1. typedef int (*print_data)(void *data);
  typedef特殊功能:定义一系列相关的类型,我们这里定义了返回值是 int 型的函数指针

2.声明list_print 函数 ,头文件中
  1. int print_list(LIST *l,print_data print);

3.实现list_print 函数,C文件中
  1. int print_list(LIST *l,print_data print)
  2. {
  3.     LIST *list=l->next;//指向第一个 结点
  4.     printf("the length is %d\n",l->length);
  5.     while(list!=NULL)
  6.     {
  7.         print(list->data);//这里的print地址我们将在main中声明定义,
  8.                         //使用 函数指针
  9.         list=list->next;
  10.     }
  11.     return 0;
  12. }


4.调用方法 ,在main中

  实现print函数,static指明只能在当前C文件中有效使用
  1. static int print_char(void *data)
  2. {
  3.     printf("%c\n",*(char*)data);
  4.     return 0;
  5. }

int main()
{
   ......

   print_list(list,print_char);   //显示链表数据
   ......
}



这次修改为v4-0 :
 v4-0.rar  

李先静写的代码也上传:写的好漂亮啊:
 拥抱变化代码1.4.rar  

-----------------------------------------------------------------------------------

2011.5.16 又看了 回调函数 的实现


  1. #include <stdio.h>

  2. typedef int (*fun)(void *data);   定义函数类型

  3. int print_fun(void *a, fun print)  其实应该在 封装库 C文件中
  4. {
  5.     print(a);             还不知道,打印哪种类型 的数据。。只有调用者 自己知道
  6.     return 0;
  7. }

  8. *******************************************

  9. int print_int(void *data)   主函数中  调用者实现  打印 int型  数据                   
  10. {
  11.     printf("%d\n",*(int *)data);
  12.     printf("(int *)data=%p\n",(int *)data);    打印 ch1 内存地址
  13.     //printf("%d\n",(int)data);  这个不行,为什么 书上是这么写 ???
  14.     return 0;
  15. }

  16. int main(int argc, char *argv[])
  17. {
  18.     int ch1 = 234;
  19.     int ch2;
  20.     
  21.     print_fun(&ch1,print_int);   // 调用 C 文件中函数,
  22.     printf("&ch2=%p\n",&ch2);

  23.     return 0;
  24. }
指针: 1 指向一块连续的内存   如:int 型,指向了4 个单元的连续地址
       2. 指向连续内存的首地址

 但是 void * 指针类型: 因为 void 是空类型,所以它 只有第二条: 指向连续内存的首地址

   我们发现,ch1 ch2 还是相隔了 4 个单位(字节) ,void * 类型 只是指向了 首地址

  1. ywx@yuweixian:~/yu/professional/1$ ./huidiao
  2. *(int *)data234
  3. (int *)data=0xbfe891bc
  4. &ch2=0xbfe891b8

阅读(700) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~