![](/img/trans.png)
[英]How to cast a C void* pointer to a pointer to a struct (with definition of the struct as a string)?
[英]Not Understanding Void Pointer / How to cast? (C Programming)
假设我想编写一个函数: int read_file (char *filename, void *abc)
读取文件,并将数字放入abc
指向的数组中。 我必须使用 void 指针 - 我知道如果它是int *abc
而不是 void 我会怎么做,因为我可以在语法上像一个数组一样对待abc
,并且做像abc[0]=1
这样的事情,但在这里我可以'不要这样做,因为它是一个空指针。
我对空指针不太熟悉,我应该如何让它工作。 请帮忙! 我不想发布代码,因为这是一个学校作业,我只想知道我如何将文件中的信息放入abc
指向的数组中,也许使用强制转换(但不确定如何做)。
我已经熟悉将文件信息放入数组中,如果它是由int abc
给出的。
如果始终使用abc
参数的int
数组调用read_file
则可以将其复制到int
指针并使用它。
int *p = abc;
在大多数情况下,从一种类型更改为另一种类型时需要强制转换,但是void *
可以在没有安全转换的情况下自由转换为或从任何非函数指针转换。
在幕后,所有指针都是相同的——它们是代表内存地址的整数。 所以你可以以任何方式投射它们。 去吧:
int *p = (int *)abc;
瞧 - 你有你的int *
,你已经知道如何处理了。 顺便说一句,这是“强制转换”的事情 - 在表达式前面的括号中写入所需的类型以“强制转换”它。 它将采用相同的位并以不同的方式重新解释它们。
在少数情况下,C 实际上足够聪明来转换数据,而不是盲目地使用相同的位。 例如:
float f = 3.75;
int i = (int)f;
在这种情况下, i
将包含3
因为在这种情况下它会向下舍入。 并且int
在内存中的存储方式与float
不同,因此这里进行了实际的转换。
在其他情况下,它会完全禁止你施放,因为它没有多大意义:
char *c = "Hello, world!";
float f = (float)c;
但很多时候你可以逃脱它。 尤其是三分球,一切都是公平的。 现在,请注意,能力越大,责任越大。 尽管您可以做到,但这并不意味着结果是合理的,并且使用它不会使您的程序崩溃。 当心。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.