VOID是什么意思'没有'或'任何'

时间:2012-07-28 17:09:23

标签: c++

VOID是什么意思?它是什么意思'没有'或者意味着什么?

在字典中搜索时,答案是什么都没有。但有些人说这意味着什么。 我很困惑它是否与null相同或具有独特的含义。 当我在google上搜索它的含义时,我得到了无效指针的结果以及我无法理解的更多内容,最后我是一个12级女孩。

4 个答案:

答案 0 :(得分: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.
}

答案 1 :(得分:8)

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

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

这里重要的是内存块中的位是0&1;和1&#39; s。一个例子是01101010。我想说的是0和1都不是整数,也不是字符,也不是小数值。它们本质上是没有任何东西,你将决定如何看待它们。如果您决定将它们视为整数,那么01101010将被视为数字106(十六进制的6A,写为0x6A),而如果您决定将这些位视为字符,那么位将被视为字母&#39; j&#39;。

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

  1. 您告诉计算机您愿意将内存中的位视为整数值。
  2. 您要求在内存中保留足够数量的字节,可以容纳int,这是多少?由于int通常为32位(可能或多或少取决于CPU,OS等),因此您要求从内存中保留32位。那是多少字节?既然我们已经说过每个内存块是8位,那么你要求保留4个字节的内存,它们将是连续的(例如,你将保留地址00AA F00000AA F001,{{ 1}},00AA F002)。这意味着不同的变量类型将根据其大小在内存中保留不同的字节数。因此00AA F003只保留1个字节,因为它是8位,而char将保留8个字节,因为它需要64位,依此类推。 指针不是这样,所以请注意!
  3. 在我跳转到指针之前,我想以不同的方式重复这个想法:floattype variable_name意味着你要将内存的内容视为整数,你将保留4个字节。更改类型将改变位的处理。

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

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

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

    1. 在内存中保留32位以在其中放入内存地址。
    2. 每当我们说AA00 FF04时,我们会在内存中跳过多个块,这些块相当于指针类型的大小(以字节为单位),与你指向的东西的类型无关至。下面是一个示例:p++现在char c; int *p; p = &c;指向p所在的内存地址,c不指向下一个内存地址,它将指向地址距离初始位置4个字节,因为int指针的一步大小是4个字节。
    3. 那么p++是什么? void意味着&#34;什么都没有&#34;或&#34;没有类型&#34;。话虽如此,让我们检查变量和指针上的void:

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

      你能说void x就像你说void *p一样吗?是的你可以,因为你说你想要一个指针,并且知道它是一个指针,我们直接知道你需要32位内存,我们也知道你想把它们当作一个内存地址,所以这里没有歧义上一个案例。好的,当我们告诉int *p指针在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 类型时,你说它在调用它时没有返回任何东西(在C ++中有效)。以下是您可以做的以及您无法做到的事情:

      void

      我们是否受益于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. 功能?是的,不是每个函数都会向我们返回一些东西。假设您正在为具有记分牌的游戏编写程序。当一个新游戏开始你想要将分数重置为0.假设你有一个名为void的函数来完成这项工作,重新调用后没有任何重要的信息可以在你调用之后返回给你,所以你可能会做这个功能为ResetScore()。如果您需要从该功能获得一些反馈,那么您可能会开始考虑不同的类型。

      我希望这能为你澄清一些事情。我再次写了一个详细的答案,因为你说你是12年级。祝你好运!

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

      在我们理解void ResetScore()函数和非void函数之间的区别之前,我们需要回答一个问题。如果一个函数不是void,并且每当我们调用它时,它将返回一些东西,那么,谁将捕获函数的返回值?&#34;

      简单。获得回报的人是那个打电话的人。例如,如果我们有一个函数void并且在程序中间某处有int F1(),那么x = F1();就会捕获函数x的返回值。这个概念不适用于F1()函数,因为它们不会返回任何内容,换句话说void然后某处void F2()将无效,因为F2不会返回任何内容,因此我们可以& #39; t以与我们使用F1相同的方式使用它。

      所以主要的规则是调用的人是捕获函数返回的人。在这种情况下,y = F2();void main()之间有什么区别?在C ++中,main()函数必须具有返回值,因此不允许int main()。但是对于其他函数,不同之处在于void main()的函数不会向调用者返回任何内容,而void则会返回。那么,谁调用int函数?操作系统(OS)调用它。从main函数返回操作系统有什么好处?知道程序是否正常终止或异常终止是有益的,因此在异常终止时,操作系统可以向您展示众所周知的&#34;发送/不发送&#34;报告消息(在这里谈论Microsoft Windows)。所以main的返回类型对你的程序或它的输出没有任何影响,它只会影响它的终止方式,因为函数的返回是函数中发生的最后一件事,并返回{ {1}}函数是所有程序中的最后一项(退出程序时)。

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

答案 2 :(得分:1)

'void'表示'无类型'。如果函数返回类型为'void',则表示它不返回任何类型的值。

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

答案 3 :(得分:0)

VOID并不意味着什么。 C / C ++中指向void类型的指针可用于指向任何类型的指针,其中一些指针应具有类型转换,例如指向函数的指针。 VOID表示没有类型或没有参数列表。

相关问题