6

VOID 是什么意思?是“无”还是“无”?

查字典的时候,答案是什么都没有。但有人说这意味着什么。我很困惑它是否与 null 相同或具有独特的含义。当我在谷歌上搜索它的含义时,我得到了空指针的结果以及更多我无法理解的东西,最后我是一个 class12 的女孩。

4

4 回答 4

19

在 C++ 中,void 在不同的上下文中可能意味着不同的东西。例如,void指针表示可以指向任何对象的指针

int x = 0;
void *p = &x; // ok -- void pointers can point to any object.

但是当 void 用作函数的返回类型时,这意味着该函数不返回任何内容。

void f()
{
  cerr << "Hello there\n";
  // No return, since the function has a void return type.
}
于 2012-07-28T17:11:11.797 回答
8

让我给你一些关于变量声明、函数和指针的详细解释void,因为你提到你是 12 年级。请允许我从变量声明开始,因为它更适合我的解释。

首先,当你声明一个变量时会发生什么?换句话说,当你说 时会发生什么int x?如您所知,所有变量都驻留在内存中。内存被分成块,每个块为 8 位宽。这些块被称为字节,是大多数计算机体系结构中最小的可寻址内存单元。每个字节都有一个数字,我们通常使用十六进制数字来表示每个字节的内存地址。例如,内存中的第一个位置是0000 0000只能保存 8 位的地址。第二个字节位于0000 0001。依此类推,直到到达地址的最后一个字节FFFF FFFF

这里重要的是内存块内的位是 0 和 1。一个例子是01101010。我想说的是,0 和 1 既不是整数,也不是字符,也不是十进制值。它们本质上什么都不是,您将决定如何看待它们。如果您决定将它们视为整数,01101010则将被视为数字 106(十六进制的 6A,写为0x6A),而如果您决定将这些位视为字符,则这些位将被视为字母“j”。

回到我的问题。当你说的时候会发生什么int x?有很多事情发生:

  1. 您告诉计算机您愿意将内存中的位视为整数值。
  2. 您要求在内存中保留足够数量的字节以容纳int,那是多少?由于int通常是 32 位(可能或多或少取决于 CPU、操作系统等),因此您要求从内存中保留 32 位。那是多少字节?由于我们已经说过每个内存块是 8 位,那么您要求保留 4 个字节的内存,它们将是连续的(例如,您将保留地址00AA F000, 00AA F001, 00AA F002, 00AA F003)。这意味着不同的变量类型将根据它们的大小在内存中保留不同数量的字节。所以 achar将只保留 1 个字节,因为它是 8 位,而 afloat将保留 8 个字节,因为它需要 64 位,依此类推。指针中不是这种情况,所以请注意!

在我跳转到指针之前,我想以不同的方式重复这个想法:type variable_namelikeint x意味着您将内存的内容视为整数,并且您将保留 4 个字节。更改类型将更改位的处理方式。

现在指点。当你说的时候会发生什么int *p?它与普通变量完全不同。指针可以告诉你某物的位置(某物的内存地址)。根据上面的解释,每个内存地址都是这样的十六进制数:AA00 F001。所以内存地址是一个 8 位的十六进制数,这意味着它是一个 32 位的数字。因此,当您创建指针时,您是说要将位视为内存地址(不是整数,不是字符,不是十进制值等)。因此,所有指针变量都将在内存中保留相同数量的块,即 4 字节(32 位),因为任何内存地址都是 32 位。所以int *pchar *q两者都将在内存中保留 4 个字节,因为两者都将在它们内部保存一个 32 位宽的内存地址。

这里开始行动。从理论上讲,如果所有类型的指针都会在内存中保留相同数量的位,我们为什么不使用char指针来指向int变量(如char *q; int x; q = &x;)?理论上你可以做这个指针但是有一个问题。正如我之前所说,anint将占用内存中的 4 个字节,而 achar将只占用 1 个字节。这意味着如果一个int位于内存中的地址AA00 FF00并且您想在它旁边放置另一个,则新的将位于该地址上,AA00 FF04因为第一个int已经保留的 4 个字节(从AA00 FF00AA00 FF03)和下一个可用的内存位置(地址)将在AA00 FF04这种情况下。还在我这儿?

所以指针声明意味着两件事:

  1. 在内存中保留 32 位以将内存地址放入其中。
  2. 每次我们说p++我们将在内存中跳转多个块,这些块等于指针类型的大小(以字节为单位),并且与您所指向的事物的类型无关。举个例子:char c; int *p; p = &c;nowp是指向所在的内存地址,c不会p++指向下一个内存地址,而是指向距离初始位置4个字节的地址,因为一个int指针的一步大小是 4 个字节。

那么是什么voidvoid是表示“无”或“无类型”的东西。话虽如此,让我们检查变量和指针的 void:

你能void x像你说的那样说int x吗?不,你不能,因为在变量声明中你指定了如何处理一些位以及你需要多少位。当您说void x您没有指定如何处理这些位时,也没有说您需要多少位。

你能void *p像你说的那样说int *p吗?是的,你可以,因为你说你想要一个指针,并且知道它是一个指针,我们直接知道你想要内存中的 32 位,我们也知道你想把它们当作内存地址,所以这里没有歧义上一个案例。好的,当我们告诉void指针递增时会发生什么p++?这是问题所在。当指针类型已知时,内存中的跳转是已知的,但在这里它是未知的。解决办法是什么?稍后您需要转换void指针,这样您就可以知道每次递增时可以在内存中跳转多少块。好吧,如果最后我们会投到什么东西上,我们会得到什么好处呢?为什么我们不从一开始就直接在那个东西的类型中创建它呢?通常一个void指针被创建,您将每次使用它来指向不同的类型,而不仅仅是一种类型。如果在某个应用程序中你已经知道你总是会指向一个int例子,那么创建一个void指针没有任何好处,但是如果你知道你需要指向不同的类型,那么这里void指针就变得很方便了。当然,这不是初学者级别的话题。

好的,所以void没有任何意义,它与功能有什么关系?如您所知,函数的类型是函数返回内容的定义。因此,每次调用时,int函数都会返回一个。int以下是一些有效的示例:

int Function1();
//...
//somewhere in the middle of your program
int x, y;
x = Function1(); //valid
y = ( 100 - Function1() ) / 2; //valid
Function1(); //also valid but the return is lost since it wasn't stored or displayed

当您说函数是类型void时,您是在说调用它时它不返回任何内容(这在 C++ 中有效)。以下是您可以做和不能做的事情:

void Function2();
//...
//somewhere in the middle of your program
int x, y;
x = Function2(); //NOT valid, Function2 will not return anything to be stored in x
y = 100 + Function2(); //Not valid, Function 2 will not return anything to be added to 100
Function2(); //valid, the function will be called, and will do some work, then you will continue execution after it terminates.

我们是否从void函数中受益?是的,很多,并不是每个函数都会返回一些东西给我们。假设您要为具有记分牌的游戏编写程序。当一个新游戏开始时,你想将分数重置为 0。假设你有一个名为的函数ResetScore()来完成这项工作,在你调用它之后,resetting 没有任何有价值的东西可以返回给你,所以你可能会做这个函数void ResetScore()。如果您需要从该功能获得一些反馈,那么您可能会开始考虑另一种类型。

我希望这可以为您澄清事情。既然你说你是12年级,我又写了一个详细的答案。祝你好运!

编辑:在下面的评论中回答您的问题:

void在我们了解函数和非空函数之间的区别之前,我们需要回答一个问题。如果一个函数不是void,无论何时我们调用它,它都会返回一些东西,那么,谁来捕捉函数的返回呢?”

简单的。抓住回报的人就是打电话的人。例如,如果我们有一个函数int F1(),并且在你的程序中间的某个地方,那么你x = F1();就是x那个将捕获函数返回的人F1()。这个概念不适用于void函数,因为它们不返回任何内容,换句话说,由于 F2 不返回任何内容,因此void F2()某处y = F2();将无法工作,因此我们不能像使用 F1 一样使用它。

因此,主要规则是调用者是捕获函数返回的人。void main()在这种情况下,和 和有什么区别int main()?在 C++ 中 main() 函数必须有一个返回值,所以void main()是不允许的。但是对于其他函数,不同之处在于它们void不会向调用者返回任何内容,而它们会返回int。那么,谁调用该main函数?操作系统 (OS) 调用它。操作系统从main函数返回有什么好处?了解程序是否正常终止或异常终止是有好处的,因此在异常终止时,操作系统可以向您显示众所周知的“发送/不发送”报告消息(此处讨论 Microsoft Windows)。所以返回类型main()对您的程序或其输出没有影响,它只会影响它如何终止,因为函数的返回是函数中发生的最后一件事,而函数的返回main()是所有程序中的最后一件事(当你退出程序)。

我希望这能澄清你的问题。

于 2012-07-28T20:09:39.827 回答
1

“空”的意思是“没有类型”。如果函数返回类型为“void”,则意味着它不返回任何类型的值。

然而,指向 void 的指针意味着它是一个没有特定类型的指针,这些指针通常必须转换为正确的类型。

于 2012-07-28T18:22:18.773 回答
0

VOID 没有任何意义。在 C/C++ 中指向 void 类型的指针可用于指向任何类型的指针,其中一些应该进行类型转换,例如指向函数的指针。VOID 表示没有类型或没有参数列表。

于 2012-07-28T18:33:46.967 回答