something about pointer,void *,and generic function
内容比较简单,但是考虑到函数的通用性后,看出还是比较有意思的。
需要注意的字符串的交换以及字符串的比较,同其它语言的实现,差异还是比较大的,
使用了指向指针的指针~~~~~~~~~~~~~~~~·
- SWAP(INT *A,INT *B)
- {
- INT TEMP;
- TEMP= *A;
- *A=*B
- *B=TEMP;
- }
- void * swap(void * vp1,void * vp2,int size)
- {
- char buffer[size];
-
- memcp(buffer,vp1,size);
- memcp(vp1,vp2,size);
- memcp(vp2,buffer,size);
- }
- think
- int a,int b
- swap(&a,&b,sizeof(int));
- int a=4;
- short b4;
- swap(&a,&b,sizeof(int));
- think deep now ,
- char * h=strdup("abcd");
- char * w=strdup("efghaisis");
- so ,if you want to exchage this char ?what would you like to do ?
- can you tell the difference below?
- SWAP(&H,&W,SIZEOF(CHAR *));
- SWAP(H,W,SIZEOF(CHAR *));
- INT * LSERACH(INT A,
- INT ARR[],
- INT N)
- {
- FOR( I=0 ; I<N ; I++)
- IF ( A == ARR[I])
- RETURN I;
-
- RETURN -1
-
- }
- VOID * LSEARCH(VOID * KEY,
- VOID * BASE,
- INT N,
- INT ELIEMENTSIZE
-
- {
- FOR (INT I= 0; I<N ; I++)
- {
- VOID * ELEMENTADDR =(CHAR *)BASE +I*ELEMENTSIZE;
- IF MEMCMP(KEY,ELEMENTADDR,
SIZEOF(ELEMENTSIZE) ) == 0
- RETURN ELEMENTADDR
- }
- RETURN NULL;
- }
- VOID * LSEARCH(VOID * KEY,
- VOID *BASE,
- INT IN,
- INT ELEMENTSIZE,
- INT (*COMFN)(VOID *,VOID *)
- )
- {
- FOR (I =0 ;I< N; I++) {
- VOID * ELEMENTADDR = (CHAR *) BASE + I*ELEMENTSIZE;
- IF (COMFN(KEY,ELEMENTADDR) == 0 )
- RETURN ELEMENTADD;
- }
- RETURN NULL;
- INT A[]={1,4,8,0,6,9};
- INT N=6;
- KEY=6
- LSEARCH(6,A,6,INTCMP)
-
- INT INTCMP(VOID * ELEMENT1,
- VOID * ELEMENT2)
- {
- INT * P1=ELEMENT1;
- ITN * P2=ELEMENT2;
- RETURN *P1-*P2;
- }
-
- BUT WHAT IF CHARCMP?
- CHAR *NOTES={"ABC","EFG","HIGHII","E","D"}
- CHAR * KEYNOETE="EB";
- CHAR **FOUND
- LSERACH(&KEYNOTE,NOTES,6,SIZEOF(CHAR *),STRCMP)
- ? STRCMP?
- INT STRCMP(VOID * P1,
- VOID * P2)
- {
- CHAR * S1= *(CHAR **) P1;
- CHAR * S2=*(CHAR **) P2;
- RETURN STRCMP(S1,S2);
- }
阅读(1181) | 评论(0) | 转发(0) |