假设我想写一个函数:
int read_file (char *filename, void *abc)
读取文件,并将数字放在abc
指向的数组中。
我必须使用void指针 - 我知道如果它是int *abc
而不是void,我会怎么做,因为我可以在语法上像abc
一样处理数组,并执行abc[0]=1
之类的操作,但在这里我不能这样做,因为它是一个无效指针。
我不太熟悉void指针,以及我应该如何使用它。请帮忙!我不想发布代码,因为这是一个学校作业,只是想知道如何将文件中的信息放入abc
所指向的数组中,也许用铸造(不知道怎么办)虽然)。
如果由int abc
给出,我已经熟悉将文件信息放入数组中。
答案 0 :(得分:1)
如果始终使用read_file
参数调用int
abc
,则可以将其复制到int
指针并使用该指针。
int *p = abc;
在大多数情况下,您需要在从一种类型更改为另一种类型时进行转换,但是void *
可以在没有安全转换的情况下自由地转换为任何非函数指针。
答案 1 :(得分:0)
在引擎盖下,所有指针都是相同的 - 它们是表示内存地址的整数。所以你可以把它们扔到哪个方向。去吧:
int *p = (int *)abc;
瞧 - 你有int *
你已经知道如何处理。这是"铸造"顺便说一句,在表达式前面的括号中写下所需的类型为" cast"它。它将采用相同的位并以不同的方式重新解释它们。
在少数情况下,C实际上足够智能转换数据而不是盲目地使用相同的位。例如:
float f = 3.75;
int i = (int)f;
在这种情况下,i
将包含3
,因为在这种情况下它会向下舍入。并且int
存储在内存中的方式与float
不同,因此此处会进行实际转换。
在其他情况下,它会禁止你施放,因为它的意义不大:
char *c = "Hello, world!";
float f = (float)c;
但很多时候你可以逃脱它。特别是指针,一切都是公平的游戏。现在,请注意,强大的力量带来了巨大的责任。虽然你可以这样做,但并不意味着结果是明智的,并且使用它不会让你的程序崩溃。小心。