void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
C语言规定,指针变量也可以定义为void型,比如:
void *p;
这里p仍然是一个指针变量,有自己的内存空间,占用2个字节(TurboC环境)。但是不指定p指向哪种类型的变量。
例如
main()
{
float f=1.6, *pf;
void *p;
p=(void*)&f;
pf=(float*)p;
printf("\n&f=%X, p=%X, pf=%X", &f, p, pf);
printf("\n*pf=%f", *pf);
}
程序运行的结果为:
&f=FFD2, p=FFD2, pf=FFD2
*pf=1.600000
|
变量f的指针被强制转换为void*类型,赋值给了void类型的指针p。p又被强制转换为float*类型,赋值给pf。实际上在程序中,&f, p和pf的内存地址值都是相同的,不同的是指向的类型有所不同。
自己的例子:
304 INT32 *p0; 305 UINT8 *str; 377 UINT16 fd; 378 struct stat sb; 379 INT32 * map_memroy_addr; 380381 382 if(fd == -1) printf("chen open fail\n"); 383 fstat(fd, &sb); 384 390 map_memroy_addr = (void *) mmap(0, sb.st_size, PROT_READ | PROT_EXEC, MAP_SHARED, fd, 0);
/*将mmap的返回地址定义为void指着类型,*/ 394 close(fd); 395 if (map_memroy_addr == MAP_FAILED){ 396 perror("chen"); 397 }else{ 399 p0 = map_memroy_addr; 416 str = (UINT8*)p0 + 21; 420 //str =(UINT8*)(p0+1); 这句会是什么结果 421 //str =(UINT8*)p0+1; 这句又会是什么结果 430 printf("chen str = %c\n", str);
436 return str;
|
其中map_memroy_addr、p0都被强制赋值为void指着类型了。
在给str赋值时,又将void指着类型强制转换为str的类型(UINT8*)
上例中,420,421行,
书上关于void指针类型说:ANSI标注要求动态分配系统返回void指针。void具有一般性,它可以指向任何类型的数据。但是目前有的C编译所提供的这类函数啊妇女会char指针。
本人所用的系统,返回的属于int32,也就是32位4个字节。这样的话,
420中虽然p0 + 1;但是括号之后,就是按照系统默认的加了4个字节,然后再强制转换成UINT8*类型
421中呢,就是先把p0转换成UINT8*之后,再加1,就是正常的加了一个字节了。
阅读(1333) | 评论(0) | 转发(0) |