Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1754317
  • 博文数量: 335
  • 博客积分: 4690
  • 博客等级: 上校
  • 技术积分: 4341
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-08 21:38
个人简介

无聊之人--除了技术,还是技术,你懂得

文章分类

全部博文(335)

文章存档

2016年(29)

2015年(18)

2014年(7)

2013年(86)

2012年(90)

2011年(105)

分类: C/C++

2012-12-13 22:17:44

something about pointer,void *,and generic function 
内容比较简单,但是考虑到函数的通用性后,看出还是比较有意思的。
需要注意的字符串的交换以及字符串的比较,同其它语言的实现,差异还是比较大的,
使用了指向指针的指针~~~~~~~~~~~~~~~~·

点击(此处)折叠或打开

  1. SWAP(INT *A,INT *B)
  2. {
  3.  INT TEMP;
  4.  TEMP= *A;
  5.  *A=*B
  6.  *B=TEMP;
  7.  }


  8. void * swap(void * vp1,void * vp2,int size)
  9. {
  10.     char buffer[size];
  11.     
  12.     memcp(buffer,vp1,size);
  13.     memcp(vp1,vp2,size);
  14.     memcp(vp2,buffer,size);
  15. }

  16. think
  17. int a,int b
  18. swap(&a,&b,sizeof(int));

  19. int a=4;
  20. short b4;
  21. swap(&a,&b,sizeof(int));


  22. think deep now ,
  23. char * h=strdup("abcd");
  24. char * w=strdup("efghaisis");
  25. so ,if you want to exchage this char ?what would you like to do ?
  26. can you tell the difference below?
  27. SWAP(&H,&W,SIZEOF(CHAR *));
  28. SWAP(H,W,SIZEOF(CHAR *));

  29. INT * LSERACH(INT A,
  30.                             INT ARR[],
  31.                             INT N)
  32.                             {
  33.                             FOR( I=0 ; I<N ; I++)
  34.                              IF ( A == ARR[I])
  35.                              RETURN I;
  36.                             
  37.                              RETURN -1
  38.                              
  39.                             }

  40. VOID * LSEARCH(VOID * KEY,
  41.                              VOID * BASE,
  42.                              INT N,
  43.                              INT ELIEMENTSIZE
  44.                             
  45. {
  46.     FOR (INT I= 0; I<N ; I++)
  47. {
  48.         VOID * ELEMENTADDR =(CHAR *)BASE +I*ELEMENTSIZE;
  49.         IF MEMCMP(KEY,ELEMENTADDR, SIZEOF(ELEMENTSIZE) ) == 0
  50.         RETURN ELEMENTADDR
  51. }
  52. RETURN NULL;
  53. }
  54. VOID * LSEARCH(VOID * KEY,
  55.                             VOID *BASE,
  56.                             INT IN,
  57.                             INT ELEMENTSIZE,
  58.                             INT (*COMFN)(VOID *,VOID *)
  59.                             )
  60. {
  61.     FOR (I =0 ;I< N; I++) {
  62.     VOID * ELEMENTADDR = (CHAR *) BASE + I*ELEMENTSIZE;
  63.     IF (COMFN(KEY,ELEMENTADDR) == 0 )
  64.     RETURN ELEMENTADD;
  65.     }
  66.     RETURN NULL;
  67. INT A[]={1,4,8,0,6,9};
  68. INT N=6;
  69. KEY=6
  70. LSEARCH(6,A,6,INTCMP)


  71.     
  72.     INT INTCMP(VOID * ELEMENT1,
  73.      VOID * ELEMENT2)
  74.      {
  75.      INT * P1=ELEMENT1;
  76.      ITN * P2=ELEMENT2;
  77.      RETURN *P1-*P2;
  78.      }
  79.     
  80.     BUT WHAT IF CHARCMP?
  81.   CHAR *NOTES={"ABC","EFG","HIGHII","E","D"}
  82.   CHAR * KEYNOETE="EB";
  83.   CHAR **FOUND
  84.   LSERACH(&KEYNOTE,NOTES,6,SIZEOF(CHAR *),STRCMP)
  85.   ? STRCMP?
  86. INT STRCMP(VOID * P1,
  87.            VOID * P2)
  88.            {
  89.            CHAR * S1= *(CHAR **) P1;
  90.            CHAR * S2=*(CHAR **) P2;
  91.            RETURN STRCMP(S1,S2);
  92.            }

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