6

VOIDとはどういう意味ですか?「何もない」という意味ですか、それとも「何か」という意味ですか?

辞書で検索すると答えは何もありませんが、何か意味があると言う人もいます。私は混乱していますが、それはnullと同じ意味ですか、それとも独特の意味がありますか。グーグルでその意味を検索したところ、ボイドポインターなど、理解できなかったことがたくさんあり、ついにクラス12の女の子になりました。

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

12年生だとおっしゃっていたので、変数宣言、関数、ポインタについて詳しく説明しましょう。私の説明にはもっと適切なので、変数宣言から始めましょう。void

まず、変数を宣言するとどうなりますか?言い換えれば、あなたが言うとどうなりますint xか?ご存知のように、すべての変数はメモリに存在します。メモリはブロックに分割され、各ブロックは8ビット幅です。これらのブロックはバイトと呼ばれ、ほとんどのコンピュータアーキテクチャでアドレス可能な最小のメモリ単位です。すべてのバイトには数値があり、通常、各バイトのメモリアドレスを表すために16進数を使用します。したがって、たとえば、メモリの最初の位置は、0000 00008ビットしか保持できないアドレスです。2番目のバイトはにあり0000 0001ます。そして、アドレスにある最後のバイトに到達するまで続きますFFFF FFFF

ここで重要なのは、メモリブロック内のビットが0と1であるということです。例は01101010です。私が言いたいのは、0と1は整数でも、文字でも、10進数でもないということです。それらは本質的に何でもありません、あなたがそれらにどのように見えるかを決めるのはあなたです。それらを整数として表示する場合は01101010、数値106(16進数で6Aと記述され0x6Aます)として表示されますが、これらのビットを文字として表示する場合は、ビットは文字「j」として表示されます。

私の質問に戻ります。あなたが言うとどうなりますint xか?行われることはたくさんあります:

  1. メモリ内のビットを整数値として表示することをいとわないことをコンピュータに伝えています。
  2. を保持できる十分な数のバイトをメモリに予約するように求めていますが、intそれはいくらですか?通常は32ビットであるためint(CPU、OSなどによって多少異なる場合があります)、メモリから32ビットを予約するように求めています。そして、それは何バイトですか?各メモリブロックは8ビットであるとすでに述べたので、4バイトのメモリを予約するように要求し、それらは連続します(たとえば、アドレス、、、を予約し00AA F000ます00AA F001)。これは、変数の種類が異なれば、サイズに応じてメモリに異なるバイト数を予約することを意味します。したがって、aは8ビットであるため1バイトのみを予約しますが、aは64ビットを必要とするため8バイトを予約します。00AA F00200AA F003charfloatこれはポインタには当てはまりませんので、注意してください!

ポインタにジャンプする前に、別の方法でアイデアを繰り返したいとtype variable_name思いint xます。たとえば、メモリの内容を整数として扱い、4バイトを予約するという意味です。タイプを変更すると、ビットの処理が変更されます。

今ポインタ。あなたが言うとどうなりますint *pか?通常の変数とはまったく異なります。ポインタは、何かの場所(何かのメモリアドレス)を教えてくれるものです。上記の説明に基づくと、各メモリアドレスは次の16進数のようなものです:AA00F001。したがって、メモリアドレスは8桁の16進数であり、32ビットの数値であることを意味します。したがって、ポインタを作成するときは、ビットをメモリアドレス(整数、文字、10進値などではない)として扱いたいと言っています。そのため、すべてのポインタ変数は、メモリアドレスが32ビットであるため、4バイト(32ビット)である同じブロック数をメモリに予約します。だからint *pそしてchar *qどちらも32ビット幅のメモリアドレスを内部に保持するため、両方ともメモリに4バイトを予約します。

ここからアクションを開始します。理論的には、すべてのタイプのポインターがメモリ内に同じビット数を予約する場合、 (のような)変数charを指すためにポインターを使用しないのはなぜですか?理論的にはこのポインタを使用できますが、問題があります。前に述べたように、aはメモリ内で4バイトを使用しますが、aは1バイトしか使用しません。つまり、がアドレスのメモリにあり、その隣に別のバイトを配置する場合、最初に予約済みの4バイト(fromから)と次に使用可能なメモリ位置(アドレス)がアドレスに配置されるため、新しいアドレスがアドレスに配置されます。この場合になります。まだ私と一緒に?intchar *q; int x; q = &x;intcharintAA00 FF00AA00 FF04intAA00 FF00AA00 FF03AA00 FF04

したがって、ポインタ宣言は2つのことを意味します。

  1. 32ビットをメモリに予約してメモリアドレスを入れます。
  2. 私たちが言うたびp++に、ポインタのタイプのサイズ(バイト単位)に相当し、ポイントしているもののタイプとは関係のないブロックの数をメモリ内でジャンプします。次に例を示します。char c; int *p; p = &c;現在、が配置pされているメモリアドレスを指しているが、次のメモリアドレスを指していません。これは、intポインタの1ステップのサイズが原因で、初期位置から4バイト離れた場所にあるアドレスを指します。 4バイトです。cp++

それで、何voidですか?void「何もない」または「タイプなし」を意味するものです。そうは言っても、変数とポインターのvoidを調べてみましょう。

あなたが言っvoid xたようにあなたは言うことができますint xか?いいえ、できません。変数宣言では、いくつかのビットの処理方法と必要なビット数を指定しているためです。void xあなたがビットをどのように扱うかを指定していないとあなたが言うとき、あなたはあなたが必要な数を言っていません。

あなたが言っvoid *pたようにあなたは言うことができますint *pか?はい、できます。ポインタが必要だと言っていて、それがポインタであることがわかっているので、メモリに32ビットが必要であることが直接わかります。また、それらをメモリアドレスとして扱いたいこともわかっているので、ここでのあいまいさはありません。前のケース。OK、voidポインタにインクリメントするように指示するとどうなりますp++か?ここに問題があります。ポインタの種類がわかっているときは、メモリ内でのジャンプはわかっていましたが、ここではわかりません。解決策は何ですか?voidインクリメントするたびにメモリ内でジャンプできるブロック数を知ることができるように、後でポインタをキャストする必要があります。さて、最後に何かにキャストした場合、どのようなメリットがありますか?そのようなもので最初から直接作ってみませんか?通常、voidポインタは、1つのタイプだけでなく、毎回異なるタイプを指すために使用する場所に作成されます。int特定のアプリケーションで、たとえば常にポインタを指すことがすでにわかっている場合、voidポインタを作成する利点はありませんが、さまざまな型を指す必要があることがわかっている場合は、ここでvoidポインタが便利になります。確かに、これは初心者レベルのトピックではありません。

OK、それ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()します。このジョブを実行するための名前の関数があるとすると、リセットしても、呼び出した後に返される価値のあるものは何もないので、おそらく関数をとして実行しますvoid ResetScore()。その関数からフィードバックを得る必要がある場合は、別のタイプについて考え始めるかもしれません。

これがあなたのために物事を明らかにすることを願っています。あなたが12年生だと言ったので、もう一度詳細な答えを書きました。頑張ってください!

編集:以下のコメントであなたの質問に答えてください:

void関数と非void関数の違いを理解する前に、質問に答える必要があります。関数がそうでない場合、voidそれを呼び出すたびに何かが返されます。それでは、誰が関数の戻りをキャッチしますか?」

単純。リターンをキャッチしたのは、コールした人です。たとえば、関数がint F1()あり、プログラムの途中にある場合x = F1();x、関数の戻り値をキャッチしますF1()。この概念は、void関数が何も返さないため機能しません。つまり、F2は何も返さないためvoid F2()、どこかで機能y = F2();しません。したがって、F1と同じように使用することはできません。

したがって、主なルールは、呼び出すものが関数returnをキャッチするものです。void main()その場合、との違いは何int main()ですか?C ++では、main()関数は戻り値を持っている必要があるため、void main()許可されていません。ただし、他の関数の場合の違いは、関数がvoid呼び出し元に何も返さないのに、呼び出し元に何も返さないことintです。さて、誰がmain関数を呼び出しますか?オペレーティングシステム(OS)はそれを呼び出します。関数から戻ることでOSは何のメリットがありmainますか?プログラムが正常に終了したか、異常終了したかを知ることは有益です。したがって、異常終了時に、OSはよく知られている「送信/送信しない」レポートメッセージを表示できます(ここでMicrosoft Windowsについて話します)。したがって、のリターンタイプmain()プログラムやその出力には影響しません。関数の戻りは関数で最後に発生し、関数の戻りはmain()すべてのプログラムで最後になるため、終了方法にのみ影響します(プログラムを終了します)。

これであなたの質問が明確になることを願っています。

于 2012-07-28T20:09:39.827 に答える
1

「void」は「タイプなし」を意味します。関数の戻り型が「void」の場合、どの型の値も返さないことを意味します。

ただし、voidへのポインタは、特定の型のポインタではないことを意味します。このようなポインタは通常、正しい型にキャストする必要があります。

于 2012-07-28T18:22:18.773 に答える
0

VOIDは何の意味もありません。C / C ++のvoid型へのポインターは、任意の型のポインターを指すために使用できます。関数へのポインターなど、型変換が必要なものもあります。VOIDは、タイプまたはパラメータリストがないことを意味します。

于 2012-07-28T18:33:46.967 に答える