Chinaunix首页 | 论坛 | 博客
  • 博客访问: 171412
  • 博文数量: 44
  • 博客积分: 2762
  • 博客等级: 少校
  • 技术积分: 520
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-04 19:19
文章分类
文章存档

2011年(28)

2010年(16)

我的朋友

分类: C/C++

2010-10-05 13:39:46

  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;
380

381
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,就是正常的加了一个字节了。




阅读(1299) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:mmap manpage 学习

给主人留下些什么吧!~~