c语言中使用一个变量之前要对其进行定义,那么首先来看一下具体的一个变量的定义。
1. inta=10;
2. charchartest;
3. floatb=1.0;
4.regest doublex;
5.static int*int_ptr=NULL;
6.char words[10][10];
1.c语言中类型及其作用
首先看上述定义变量的方式
[存储类型]基类型 变量名[初始化];
--由此可见变量存储类型可不写(默认为auto),初始化一颗不进行(有自己的默认机制,但对于一段程序来说在变量使用之前最好能得到它的初值),由于主题的关系,存储类型不做深入探讨。
--好了下我们仔细研究一下,基类型的作用,及变量名的作用,其实在定义变量是就是为了能快是的找到某一存储单元,以及对它的引用方式,
那么变量名就代表了一个地址,变量的基类型,就为引用变量提供了方法。
如
float d;
char c;
int b;
double a;
有此图说明,对变量的引用方式,变量名代表变量首地址(x),有变量类型来确定引用其后的多少位(l),确定*(l+x)这一引用。
但就变量的基类型来说,并不只是来确定他该引用多少位,还有解析变量的方式
想想整形的存储方式,和浮点型还真是不相同呢!
好了,回到主题,那么如何进行范型编程呢。又有什么意义。
假如你正在做一个项目,里面含有很多种类型
的数据,相同的数据还要使用某个函数,那我们就要为每一种类型的数据,写一次这个函数,这样可就太麻烦了,而且会使代码长度不必要的增加。因此我们应该尽量将函数写成对,同种基类型均可使用的,或者在某种特殊
的要求下对不同的数据也能进行该操作,(有待研究),好了我们的主要思想及手法就是
内存,
内存数据复制+正确引用==范型编程主要思路
下面有简单的列子说明,该函数实现了,同类型,数据(必须具有连续的存储空间,且数组这种特殊类型除外),的交换,如果应用到,排序中可是,排序函数实现范型
#include <stdio.h>
#include <string.h> //包含memcpy
#include <stdlib.h> //包含malloc,
int swap(void* a,void* b,int size)
{
void* buf=(void*)malloc(sizeof(char)*16);
if(buf==NULL)
return -1;
memcpy(buf,b,size);
memcpy(b,a,size);
memcpy(a,buf,size);
return 0;
}
int main()
{
double a=25;
double b=10;
float c=9.0;
float d=8.0;
char c1='a',c2='b';
char * ptr1="hao";
char * ptr2="ni";
char ** pp1=&ptr1;
char ** pp2=&ptr2;
printf("交换前a:%-10lf b:%-10lf\n",a,b); //交换双精度浮点型
if(swap((void*)(&a),(void*)(&b),sizeof(double))==0)
printf("交换后a:%-10lf b:%-10lf\n",a,b);
printf("交换前c:%-10f d:%-10f\n",c,d); //交换当精度浮点型
if(swap((void*)(&c),(void*)(&d),sizeof(float))==0)
printf("交换后c:%-10f d:%-10f\n",c,d);
printf("交换前c1:%-10c c2:%-10c\n",c1,c2); //交换字符型
if(swap((void*)(&c1),(void*)(&c2),sizeof(char))==0)
printf("交换后c1:%-10c c2:%-10c\n",c1,c2);
printf("交换前ptr1:%-10sptr2:%-10s\n",ptr1,ptr2); //交换指针
if(swap((void*)(&ptr1),(void*)(&ptr2),sizeof(char*))==0)
printf("交换后ptr1:%-10sptr2:%-10s\n",ptr1,ptr2);
printf("交换前pp1:%-10spp2:%-10s\n",*pp1,*pp2); //交换二级指针
if(swap((void*)(&pp1),(void*)(&pp2),sizeof(char**))==0)
printf("交换后pp1:%-10spp2:%-10s\n",*pp1,*pp2);
return 0;
}
使用同一个函数swap(void*,void*,int);
对基类型相同的各种类型实现了交换,
其他函数思想相同