C 语言探究-泛型指针

泛型指针

    通常情况下,C只允许相同类型的指针之间进⾏转换。例如:⼀个
字符型指针sptr(⼀个字符串)和⼀个整型指针iptr,我们不允许把sptr
转换为iptr或把iptr转换为sptr。但是,泛型指针能够转换为任何类型的
指针,反之亦然。因此,如果有⼀个泛型指针gptr,就可以把sptr转换
为gptr或者把gptr转换为sptr。在C语⾔中,通常声明⼀个void指针来表
⽰泛型指针。


泛型指针实例

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>


double cpuSecond() {
	struct timeval tp;
	gettimeofday(&tp,NULL);
	return ((double)tp.tv_sec + (double)tp.tv_usec*1.e-6);
}

void initialData(float *ip,int size) {
	// generate different seed for random number
	//time_t t=NULL;
	//srand((unsigned) time(&t));
	srand((unsigned)time(NULL));
	for (int i=0; i<size; i++) {
		ip[i] = (float)( rand() & 0xFF )/10.0f;
	}
}

void printdata(float *data, int size)
{	
	for(int i=0;i<size;i++){
		printf("%f  ", data[i]);
	}
	
	printf("\n");
}

int swap1(void *x, void *y, int size)
{
	void *tmp;
	if((tmp=malloc(size))==NULL){
		return-1;
	}
	
	memcpy(tmp, x, size);
	memcpy(x, y, size);
	memcpy(y, tmp, size);
	
	free(tmp);
	return 0;
	
}

int swap2(float *x, float *y, int nelem)
{
	float tmp;
	for(int i=0;i<nelem;i++){
		tmp = x[i];
		x[i]=y[i];
		y[i]=tmp;
	}

	return 0;
	
}


int main(void)
{
	float *h_x;
	float *h_y;
	int nElem = 4096;
	
	h_x = (float *)malloc(sizeof(float)*nElem);
	h_y = (float *)malloc(sizeof(float)*nElem);
	
	initialData(h_x, nElem);
	sleep(2);  //avoid to generate the same random data
	initialData(h_y, nElem);
	
	//print 5 data
	printf("1st method\n");
	printf("before swap:\n");
	printf("x value: ");
	printdata(h_x, 5);
	printf("y value: ");
	printdata(h_y, 5);
	
	double istart = cpuSecond();
	swap1(h_x, h_y, nElem*sizeof(float));
	double iend = cpuSecond()-istart;
	
	printf("after swap:\n");
	printf("x value: ");
	printdata(h_x, 5);
	printf("y value: ");
	printdata(h_y, 5);
	printf("time elpased %f sec.\n", iend);
	
	printf("++++++++++++++++++++++++++++++++++++++++\n");
	
	printf("2st method\n");
	printf("before swap:\n");
	printf("x value: ");
	printdata(h_x, 5);
	printf("y value: ");
	printdata(h_y, 5);
	
	istart = cpuSecond();
	swap2(h_x, h_y, nElem);
	iend = cpuSecond()-istart;
	
	printf("after swap:\n");
	printf("x value: ");
	printdata(h_x, 5);
	printf("y value: ");
	printdata(h_y, 5);
	printf("time elpased %f sec.\n", iend);
	
	return 0;
}


运行结果

 从运行时间来看,虽然空指针可以用来表示泛型,可以实现多种数据类型的操作,但是在本例执行的效率并不高

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值