06-9 C语言中void类型指针的作用

1、void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据。和用int表示指针异曲同工,只是更明确是“指针”。

因此void*只能表示一个地址,不能用来&取值,也不能++--移动指针,因此不知道多少字节是一个数据单位

2、void *就是一个不能动的“地址”,在进行&、移动指针之前必须转型为类型指针

3、void *的用途:在只知道内存,但是不知道是什么类型的时候。

例子:

21ptrVoid.c

#include <stdio.h>

/****************************************************************/
/*                                                              */
/*          本程序主要介绍void类型指针的定义及使用方法          */
/*                                                              */
/****************************************************************/

//void 定义类型的指针表示一段内存的地址,但是不知道是什么类型的数据,
//定义时不能用不能用来&取值,也不能++--移动指针,因此不知道多少字节是一个数据单位
//因为不知道是具体什么类型,如果移动指针时不知道要移动几个字节,所以不能移动。
int main(int argc, char *argv[])
{
	int nums[] = {3,5,6,7,9};
	void* ptr1 = nums;
	//int i = *ptr1;              //这样去指针指向内存的值的方法无法调用并编译通过
	int* ptr2 = (int*)nums;       //将其转换为类型指针
	printf("%d,%d\n",ptr1,ptr2);
	int i = *ptr2;
	printf("%d\n",i);
	
	return 0;
}

22ptrVoidStruct.c

#include <stdio.h>
#include <string.h>
/****************************************************************/
/*                                                              */
/*  本程序主要介绍void类型指针,在结构体和方法中的传入传出应用   */
/*  并自己写一个memset()函数,体验void类型指针的使用方法      */
/*                                                              */
/****************************************************************/

typedef struct _Person
{
	char *name;
	int age;
} Person;

void zeromem(void *data,int byteSize)
{
	//char就是一个字节,而计算机中是以字节为单位
	char* ptr = (char*)data;
	int i;
	for(i=0;i<byteSize;i++)
	{
		*ptr = 0;
		ptr++;             //因为ptr是char指针,所以为逐字节移动
	}
}
int main(int argc, char *argv[])
{
	int nums[20];
	/*
	memset(nums,0,sizeof(nums));  //memset()函数可以初始化各种类型的数组
	                              //但在函数应用时传入的参数并不知道是哪
								  //种类型指针,因此在函数的定义中,第一
								  //个参数可以定义为void类型指针,以完成对
								  //各种类型数组的初始化
	char chs[2];
	memset(chs,0,sizeof(chs));
	*/
	zeromem(nums,sizeof(nums));
	int i;
	for(i=0;i<sizeof(nums)/sizeof(int);i++)
	{
		printf("%d|",nums[i]);
	}
	Person p1;
	zeromem(&p1,sizeof(Person));//传入时是p1的地址
	printf("\n%d\n",p1.age);

	
	return 0;
}

课程中老师布置任务为写一个自己的memcpy,今天没有成功




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值