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,今天没有成功