Chinaunix首页 | 论坛 | 博客
  • 博客访问: 133394
  • 博文数量: 38
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 191
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-16 11:31
个人简介

嵌入式新人

文章分类

全部博文(38)

文章存档

2016年(38)

我的朋友

分类: 嵌入式

2016-08-13 09:26:53

C语言中的void和void *是一个经常被忽略的知识点,这里对它们的用法进行总结

1 void的作用

C语言中,void意为“不确定类型”, 不可以用void来声明变量(例如,void a = 33;编译时编译器会报错,Error:variable or field ‘a’ declared void),void通常用于对函数的限定:

(1)对函数返回的限定,当函数不需要返回值值时,必须使用void限定,例如:void func(int a,char *b)。

(2)对函数参数的限定,当函数不允许接受参数时,必须使用void限定,例如:int func(void)。

2 void * 的作用

     C语言中,void *意为“不确定类型指针”,不确定的含义是指使用void*声明指针时,指针的类型不确定,在后续使用该指针时,需要通过强制类型转换将该指针转为所需要的类型。例如

  1. #include <stdio.h>

  2. // #define NULL (void *)0 ///usr/include/libio.h中对NULL有定义

  3. int main( void )
  4. {

  5.     int *a = NULL,*b = NULL;
  6.     void *p1, *p2;
  7.     p1 = a; //p1是void * 型指针,任何类型的指针都可以直接赋值给它,无需进行强制类型转换
  8.     b = (int *)p2; //b是整型指针,p2是void * 型指针,p2赋值给b时需要强制类型转换
  9.     
  10.     printf("I am eric .\n");
  11.     printf("a = %p. \na++ = %p.\n",a,a++);
  12.     printf("p2 = %p. \np2++ = %p.\n",p2,p2++);
  13. return 0;
  14. }

输出结果

可见,在GNU C中,允许void指针进行算术运算,如p++或p+=1等,因为在缺省情况下,GNU 认为void *和char *一样,这里sizeof(*p)==sizeof(char)。

在ANSI C中,则不允许对void *指针进行算术运算,如p++或p+=1等,因为char型操作sizeof(char)字节,int型操作sizeof(int)字节,而void型则不知道操作几个字节。

可见, GNU较ANSI更“开放”,提供了更多语法的支持。但在实际应用时,还是应该尽可能地迎合ANSI标准。

3 voidC语言库函数中的应用

void *指针可以指向任意类型的数据,在程序设计时会带来便利,例如函数形参为指针类型时,可以将其定义为void *指针,这样在调用函数传参时,就可以给其传递任意类型的指针,如内存操作函数memcpy和memset的函数原型分别为:

void * memcpy ( void *dest, const void *src, size_t n );

void * memset ( void *s, int c, size_t n );

     这样,任何类型的指针都可以传入memcpy和memset中,真实体现了内存操作函数的意义:函数操作对象仅是内存存储单元,而不论这片内存是什么类型(参见C语言实现泛型编程)。

使用void *指针的另一个实例:malloc函数返回的指针就是void *型,在使用这个指针时,要进行强制类型转换,需要显式说明该指针指向的内存是存放的什么类型的数据,如(int *)malloc(1024)表示将malloc返回的void*指针指向的内存中存放的数据类型强制转换位int型。

阅读(1949) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~