博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过qsort(void * lineptr[], int left, int rifht, int (*comp)(void *, void *))解读指针函数和void指针...
阅读量:7253 次
发布时间:2019-06-29

本文共 1213 字,大约阅读时间需要 4 分钟。

原函数是《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);}

该函数有以下特点:

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的类型进行四则和取值运算,因为它虽然指向对应变量的首地址,但是他不知道该地址指向的数据类型,所以除了地址运算其他的都不能进行,也就是说使用这种转换函数,必须保证该函数内除了地址运算外,不能进行其他的运算。

还有对于 形参void * v [] 去代替实参  (void **)lineptr,对于一个指向void * 的数组来说,之所以行,是因为v[1]是可以计算,数组中存的都是指针,固定4个字节,v[1] 的地址 v + 4就行了,由因为它指向的是地址,v[1]指向一个地址,改地址又是4个字节的大小,只有这些是可以确定,其他的不行,不能对v[1][1],因为v[1]是个地址,但是这个地址指向的内容的类型不能判定,不知道把改地址指向的那块数据取几个字节,转换什么类型,都不得而知。 

 

还有个强制转换问题:

char  s[3][3];

void ** p = s;

把p转换为s的    ((char (*)[3])p)[0] = s[0] 

 

完整的程序见:

 

 

转载地址:http://xizdm.baihongyu.com/

你可能感兴趣的文章
来聊一聊Cookie(小甜饼),及其涉及到的web安全吧
查看>>
Bash Cookbook 学习笔记 【高级】
查看>>
【364天】跃迁之路——程序员高效学习方法论探索系列(实验阶段122-2018.02.04)...
查看>>
React16.2的fiber架构
查看>>
阿里云容器服务新增支持Kubernetes编排系统,性能重大提升
查看>>
[Spring boot] Spring boot + JPA 基本架构,完成CRUD
查看>>
【全栈项目上线(vue+node+mongodb)】06.nodejs服务上线(生产环境前后分离的vue项目中怎么解决跨域问题)...
查看>>
【288天】每日项目总结系列026(2017.11.20)
查看>>
git代码回滚的几种方式
查看>>
vue.js组件学习(上)
查看>>
学习开发自己的composer包,并使用GitHub实时更新到Packagist
查看>>
vue学习笔记(三)
查看>>
Mac 勿扰模式周期性开关闭功能实现脚本
查看>>
sublime中利用正则批量修改数据
查看>>
GitBook关联GitHub
查看>>
系统单据号生成规则推荐
查看>>
[译] NSCollectionView 入门教程
查看>>
【vuejs路由】vuejs 路由基础入门实战操作详细指南
查看>>
express 源码阅读(全)
查看>>
获取height固定折叠元素真实高度方法
查看>>