当前位置:编程学习 > C/C++ >>

通过qsort(void * lineptr[], int left, int rifht, int (*comp)(void *, void *))解读指针函数和void指针

原函数是《The C programint  language 》5.11问本行排序的程序,如下:

 

void qsort(void *v[], int left, int right, int (*comp)(void *,void *))  
{ 
    int i,last; 
     
    if( left >= right) 
        return; 
     
    swap(v,left,(left+right)/2); 
    last = left; 
    for(i = left + 1; i <= right; ++i) 
        if(comp(v[i],v[left]) < 0) 
            swap(v,++last,i); 
    swap(v,left,last); 
    qqsort(v,left,last-1,comp); 
    qqsort(v,last+1,right,comp); 
} 

void qsort(void *v[], int left, int right, int (*comp)(void *,void *))
{
 int i,last;
 
 if( left >= right)
  return;
 
 swap(v,left,(left+right)/2);
 last = left;
 for(i = left + 1; i <= right; ++i)
  if(comp(v[i],v[left]) < 0)
   swap(v,++last,i);
 swap(v,left,last);
 qqsort(v,left,last-1,comp);
 qqsort(v,last+1,right,comp);
}

该函数有以下特点:

1. 参数  void *v[] ,这是把main函数传递的实参转换为通用的void * * 类型的形参,那对于实参的需要自己强制转换,比如把  char * lineptr[] 传递给  v,必须这样(void ** )lineptr,

   那为什么能这样转化 

    1. 任意的类型都可以赋给相应的void类型的 

    2. 该void的类型也可以强制转换为该类型

   那为什么要这样转换 

   1. 这样转换可以满足函数通用性的要求,任何类型都可以转换为相应的void类型,相对于这个程序,把char 转换为 void,只要在comp模型中提供了comp(char *,char *)去调用,就把void 转换为 char 类型进行运算,符合程序通用化的要求;

   2. 之所以可以用void的1阶以上指针,是因为各种类型的地址字节都是固定了,win32用4个字节表示指针,所以只要该函数内的void类型的运算都是对地址的运算都可以,不能对相应的void的类型进行四则和取值运算,因为它虽然指向对应变量的首地址,但是他不知道该地址指向的数据类型,所以除了地址运算其他的都不能进行,也就是说使用这种转换函数,必须保证该函数内除了地址运算外,不能进行其他的运算。

 

 

补充:软件开发 , C语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,