繁体   English   中英

不了解空指针/如何施放? (C 编程)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM