void * 无类型指针(泛型指针)

void * 无类型指针(泛型指针)

只要你是指针就可以赋值给我例如

void *vp;
void main()
{
	char ch;
	int n;
	double x;
	vp = &ch;
	vp = &n;
	vp = *x;
}

但是无类型指针不能做++处理,如vp++,也不能做*vp使用,因为无类型,所以无法在内存中解释字节大小。但是可以做sizeof(vp);//4字节。
但是sizeof(*vp),则不能通过编译。
在程序中可以做收纳指针的功能,但是不能吧无类型指针赋值给别的类型指针,如果一定要赋值,则需要做强转。

void main()
{
	int a = 10, b = 20;
	int *p = &a;
	void *vp = &a;
	p = &b;
	vp = p;
	p = (int*)vp;
}

void* 类型:
(4字节)
无类型不能够定义变量,void a;这样的操作是无法通过编译的,而且无类型变量是不允许参与运算的

如void fun(int x)
{
	return x+10;
}

int main()
{
	int a=10;
	int c=a+fun(a);或
}

这样是无法通过编译的。
还有一个例子是无类型在断言中的用法,
assert断言后的返回值是一个被强转为了void*类型,所以assert()无法参与if或其他运算

但是同时无类型虽然不能定义变量,但是它可以定义指针
如:
void *p=NULL;
printf("%d\n",sizeof§);//可以编译通过
printf("%d\n",sizeof(*p));//不可以编译通过,无类型指针不能够解引用,失去了对内存解释的能力

但是它可以接受其他指针
如:

int main()
{
	int a=19;
	float b=2.1;
	int ar[10]={0};
	void *p=NULL;
	p=&a;
	p=&b;
	p=&ar;
	p=&p;//可以接收自己
}

这里就体现了无类型指针的能力,他可以接收任何类型的地址,所以也被称为泛型指针
但是他却没有指针加一(p+1)(p++)(p+=1)这种运算都是无法编译通过的,以你为编译器不知到
无类型指针加一需要移动几个字节,因为无类型指针可以指向多种类型的变量,所以在这种情况下
编译器不知道,void*指针指向了什么类型的变量。

还需要注意的地方有:

int main()
{
	int a=10;
	void *p=NULL;
	int *ip=&a;
	ip=p;//这里无法编译通过,无类型指针只能接收其他指针,但如果需要被其他类型的指针接收
那么就需要进行强转/
	ip=(int*)p;
}

下面为几个无类型指针的用法

void my_meset(void *vp, int c, int n,int x)
{
	if (NULL == vp || n < 1)return;
	char *p = (char*)vp;//无论什么类型的数,将其转换为char类型,这样就可以对每个字节赋值了
	for (int i = 0; i < n; i++)
	{
		*p = c;
		p++;
	}
}
void *my_memcpy(const void *p1, void *p2,  unsigned int n)//参数表的类型应该为无类型,n表示字节数这样即使在调用结构体或者数组是依旧可以使用,另外之所以在P1前加const是为了避免当复制对象是常量时,指针只能为常指针才能成功调用
{                                                         //另外之所以返回时是一个泛型指针,为的是个strcpy一样可以多次复制更加方便
#ifdef DEBUG
	if ((p1 == NULL) || (p2 == NULL))  //判空是十分重要的
	{
		return NULL;
	}
#endif
	char *p3 = (char*)p1;//之所以强转是为了达到每一个字节都复制的效果
	char *p4 = (char*)p2;//这里就是为了实现链式表达的作用从而达到多是使用
	while (n--)
	{
		*p4++ = *p3++;
	}
	return p2;
}

关于typedef和define

       typedef int *pint;
        #define sint int*
        void main()
        {
        	pint x, a;//x和a都是指针
        	sint y, b;//y是指针,b是int变量.相当于int *y,b;
        }

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值