当前位置: 技术问答>linux和unix
关于void * 的一个问题
来源: 互联网 发布时间:2016-06-18
本文导语: 在UNIX坏境编程里面有这样一段话: 从上面所示的函数原型中可以注意到另一个区别: r e a d和w r i t e的第二个参数现在是void * 类型。所有早期的U N I X系统都使用char *这种指针类型。作这种更改的原因是: ...
在UNIX坏境编程里面有这样一段话:
从上面所示的函数原型中可以注意到另一个区别: r e a d和w r i t e的第二个参数现在是void *
类型。所有早期的U N I X系统都使用char *这种指针类型。作这种更改的原因是: ANSI C使用
void *作为类属指针来代替char *。
函数原型和类属指针的组合消去了很多非ANSI C编辑程序需要的显式类型强制转换。
例如,给出了w r i t e原型后,可以写成:
float data〔1 0 0〕;
write (fd, data, sizeof(dat;a))
若使用非A N S I编译程序,或没有给出函数原型,则需写成:
write(fd, (void *)data, sizeof(data));
也可将void *指针特征用于m a l l o c函数(见7 . 8节)。m a l l o c的原型为:
第1章U N I X基础知识9
void * malloc(size_t);
这使得可以有如下程序段:
int * ptr;
ptr = malloc (1000 * sizeof(int));
它无需将返回的指针强制转换成int *类型。
想问void * 到底什么意思。ANSI C 为什么要这么做,char * 怎么就 void * 等价了呢?最好能解释下这段话的意思!谢谢哦!
从上面所示的函数原型中可以注意到另一个区别: r e a d和w r i t e的第二个参数现在是void *
类型。所有早期的U N I X系统都使用char *这种指针类型。作这种更改的原因是: ANSI C使用
void *作为类属指针来代替char *。
函数原型和类属指针的组合消去了很多非ANSI C编辑程序需要的显式类型强制转换。
例如,给出了w r i t e原型后,可以写成:
float data〔1 0 0〕;
write (fd, data, sizeof(dat;a))
若使用非A N S I编译程序,或没有给出函数原型,则需写成:
write(fd, (void *)data, sizeof(data));
也可将void *指针特征用于m a l l o c函数(见7 . 8节)。m a l l o c的原型为:
第1章U N I X基础知识9
void * malloc(size_t);
这使得可以有如下程序段:
int * ptr;
ptr = malloc (1000 * sizeof(int));
它无需将返回的指针强制转换成int *类型。
想问void * 到底什么意思。ANSI C 为什么要这么做,char * 怎么就 void * 等价了呢?最好能解释下这段话的意思!谢谢哦!
|
void*就是一无类型的指针,所有其它类型的指针都可以赋值给它而不会所生告警。
为什么加上这个指针类型是因为,当不同类型的指针赋值时都必须显示的做强制转换,否则编译就会告警。所以没有void型指针前,当你write一个非char*指针所指向的内容时就会告警,而引入void型指针后告警不复存在。
为什么加上这个指针类型是因为,当不同类型的指针赋值时都必须显示的做强制转换,否则编译就会告警。所以没有void型指针前,当你write一个非char*指针所指向的内容时就会告警,而引入void型指针后告警不复存在。
|
《ANSI C 标准详解》 - void 类型词条
|
改版了,让很多人感觉不舒服,所以就很少来了。
你的问题我也不懂
你的问题我也不懂