我有一个想法,那个void函数并不意味着“不返回任何东西”,而是返回一些类型未知的东西,比如void *
,它是可以将它与任何类型的数据一起使用的指针。所以我写了下面的代码来确定:
#include <stdlib.h>
#include<stdio.h>
void x_function(void *);
void x_function(void *d)
{
printf("the integer value of d is %d \n " , *(int *)d );
printf("the string value of d is %s \n " , (char *)d );
printf("the character value of d is %c \n " , *(char *)d );
printf("the double value of d is %lf \n " , *(double *)d );
return 10;
}
int main()
{
int x = (int)x_function(520);
printf("The Value is : %d" , x);
return 0;
}
但编译器发出错误:
error: invalid use of void expression
int x = (int)x_function(520);
我的想法是错的吗? void函数只是“不返回任何东西的函数”吗?
答案 0 :(得分:4)
是的,你的想法是错误的。 void
函数无法返回任何内容。您可以返回void *
的原因是,正如@JohnBode在评论中提到的那样,“语言标准指定可以将指向void
的指针转换为任何对象指针类型(6.3.2.3) / 1)”。指针的值被压入堆栈,然后在返回时弹出。然后可以将结果强制转换为任何类型的指针。使用void
函数,编译器不希望从堆栈中弹出任何内容,因此不会。但/ p>
答案 1 :(得分:1)
是的,你是对的:void函数不会返回任何内容,而指向void的指针可以引用任何数据类型。
答案 2 :(得分:1)
我认为它返回了一些未知类型的东西
这是错误的。
当函数的返回类型为void
时,表示函数不返回值。
具有以下功能的程序在C:
中无效void foo(int a)
{
return 0;
}
答案 3 :(得分:1)
以下是我的编译器在编译时提供的内容
t.c: In function ‘x_function’:
t.c:10:5: attention : ‘return’ with a value, in function returning void [enabled by default]
t.c: In function ‘main’:
t.c:15:5: attention : passing argument 1 of ‘x_function’ makes pointer from integer without a cast [enabled by default]
t.c:4:6: note: expected ‘void *’ but argument is of type ‘int’
t.c:15:5: erreur: utilisation invalide d'expression void
因此,当函数的返回类型为void
时,您无法返回某些内容。
根据输入类型,我认为void *
不准确,您可以传递char **
类型并将其转换为您想要的任何类型。这是在主函数中使用args
在命令行中收集参数的过程,并将其提供给您的程序。
答案 4 :(得分:0)
您错了。为正确起见,请执行以下操作:
int x = ((int(*)(void*)x_function)(520);
答案 5 :(得分:-2)
如果在c编程中使用指针,则可以从void函数返回值。