发布网友 发布时间:2022-04-26 23:35
共4个回答
热心网友 时间:2022-06-20 05:49
void *是个无类型指针,之所以这样是为了方便不同类型指针赋值。。。void * 给任何指针赋值,或者被赋值都是不会报错的,因为buffer 可能是个数字,也可能是字符串,他的类型可以是任何东西,那么作为参数需要一个可接受任何指针的类型,这个类型就是void *。。。。 其实指针就是4字节的数字,在汇编里是没有类型区分的,就是个地址。。。C语言会给所有数据和地址给定义类型,是为了编程方便,减少错误发生。。。
fwrite 就是按字节写数据,他是不需要区分数据时什么的,所以没必要知道数据的类型,那么如果参数是void* 这样给任何类型指针都能编译通过(这很重要,编译通不过就无法变成执行程序)。。。void 进入fwrite 会被强制转换成 byte 类型的指针,然后将所有数据按字节写入文件。。。。
void * 就是个指针传令兵,当你希望可以得到多种类型数据的指针时,就需要将参数写成 void *,那么编译器就不会阻拦类型不同的指针进行参数传递,这就像邮递员不需要管你信封里是什么,只要发信者和接信者知道即可。。。。
热心网友 时间:2022-06-20 05:49
void类型当作“万金油”,是为了函数的通用。调用时,需要把具体的类型强制成void类型。
比如,一个字符串buffer:
char buffer[1024];
在调用fwrite()的时候强制转换:
(void *)buffer追问可是书上是这么写的
struvt student
{
..........
};
..........
stuct student str[5]={.......};
.........
fwrite(stu+i,sizeof(struct student),1,fout);
i是循环控制变量 fout是文件指针 并没有再使用 stu的时候使用强制转换啊?
追答道理上应该对stu+i做强制类型转换。有些编译器的缺省类型检查不那么严格,不做强制转换不会出错,甚至连警告也没有。有些编译器是可以设置检查级别的,设置到最高级,就会出现警告甚至错误。
但是现在的编译器都足够聪明,对于:
stu+i
会自动转换到:
(void *)(stu+i)
因此结果并没有错误。通常,这只对void *类型比较宽容,换作其它别的类型,如果不做强制转换,大都会出错。
热心网友 时间:2022-06-20 05:49
void型指针可以直接指向任何类型的数据。
buffer是void型,所以给buffer赋任何类型的指针都是合法的。
热心网友 时间:2022-06-20 05:50
fwrite第一个参数 要求的类型是 void *
一般buffer 定义为 char 数组 (数组名 char * 类型)
so 通常 要 强制转换一下的追问可是在使用过程中直接写char数组的数组名啊 这样不就取数组的首地址了吗 基类型与char数组的数组类型不同 为什么这样使用时可以的?
追答这说明你的编译器 放水严重 主流编译器会 报错的