【NB】C语言实现泛型编程

1789137592   ·   发表于 6个月前   ·   编程代码

泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。

在 C 语言中,可以通过一些手段实现这样的泛型编程。这里介绍一种方法——通过无类型指针 void*。

看下面的一个实现交换两个元素内容的函数 swap,以整型 int 为例:
void swap(int* i1,int* i2){
int temp;
temp = *i1;
*i1 = *i2;
*i2 = temp;
}
20 Reply   |  Until 6个月前 | 1605 View

53423028
发表于 6个月前

当你想交换两个 char 类型时,你还得重写一个参数类型为 char 的函数,是不是能用无类型的指针来作为参数呢?

评论列表

  • 加载数据中...

编写评论内容

1008612
发表于 6个月前

看如下改动:
void swap(void *vp1,void *vp2){
void temp = *vp1;
*vp1 = *vp2;
*vp2 = temp;
}

评论列表

  • 加载数据中...

编写评论内容

173406131
发表于 6个月前

这段代码是错误的,是通不过编译的。首先,变量是不能声明为 void 无类型的。而你不知道调用此函数传进的参数是什么类型的,无法确定一种类型的声明。同时,不能将 * 用在无类型指针上,因为系统没有此地址指向对象大小的信息。在编译阶段,编译器无法得知传入此函数参数的类型的。这里要想实现泛型的函数,需要在调用的地方传入相关要交换的对象的地址空间大小 size,同时利用在头文件 string.h 中定义的 memcpy() 函数来实现。

评论列表

  • 加载数据中...

编写评论内容

浅殇酱
发表于 6个月前

改动如下:

评论列表

  • 加载数据中...

编写评论内容

贼娘网
发表于 6个月前

void swap(void *vp1,void *vp2,int size){
char buffer[size];//注意此处gcc编译器是允许这样声明的
memcpy(buffer,vp1,size);
memcpy(vp1,vp2,size);
memcpy(vp2,buffer,size);
}

评论列表

  • 加载数据中...

编写评论内容

1008612
发表于 6个月前

在调用这个函数时,可以像如下这样调用(同样适用于其它类型的 x、y):

评论列表

  • 加载数据中...

编写评论内容

linxun
发表于 6个月前

int x = 27,y = 2;
swap(&x,&y,sizeof(int));

评论列表

  • 加载数据中...

编写评论内容

test_test
发表于 6个月前

下面看另一种功能的函数:

评论列表

  • 加载数据中...

编写评论内容

1691684352
发表于 6个月前

int lsearch(int key,int array[],int size){
for(int i = 0;i size; ++i)
if(array[i] == key)
return i;
return -1;
}

评论列表

  • 加载数据中...

编写评论内容

py2815
发表于 6个月前

学到了[滑稽]

评论列表

  • 加载数据中...

编写评论内容
LoginCan Publish Content