VOIDとはどういう意味ですか?「何もない」という意味ですか、それとも「何か」という意味ですか?
辞書で検索すると答えは何もありませんが、何か意味があると言う人もいます。私は混乱していますが、それはnullと同じ意味ですか、それとも独特の意味がありますか。グーグルでその意味を検索したところ、ボイドポインターなど、理解できなかったことがたくさんあり、ついにクラス12の女の子になりました。
VOIDとはどういう意味ですか?「何もない」という意味ですか、それとも「何か」という意味ですか?
辞書で検索すると答えは何もありませんが、何か意味があると言う人もいます。私は混乱していますが、それはnullと同じ意味ですか、それとも独特の意味がありますか。グーグルでその意味を検索したところ、ボイドポインターなど、理解できなかったことがたくさんあり、ついにクラス12の女の子になりました。
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.
}
12年生だとおっしゃっていたので、変数宣言、関数、ポインタについて詳しく説明しましょう。私の説明にはもっと適切なので、変数宣言から始めましょう。void
まず、変数を宣言するとどうなりますか?言い換えれば、あなたが言うとどうなりますint x
か?ご存知のように、すべての変数はメモリに存在します。メモリはブロックに分割され、各ブロックは8ビット幅です。これらのブロックはバイトと呼ばれ、ほとんどのコンピュータアーキテクチャでアドレス可能な最小のメモリ単位です。すべてのバイトには数値があり、通常、各バイトのメモリアドレスを表すために16進数を使用します。したがって、たとえば、メモリの最初の位置は、0000 0000
8ビットしか保持できないアドレスです。2番目のバイトはにあり0000 0001
ます。そして、アドレスにある最後のバイトに到達するまで続きますFFFF FFFF
。
ここで重要なのは、メモリブロック内のビットが0と1であるということです。例は01101010
です。私が言いたいのは、0と1は整数でも、文字でも、10進数でもないということです。それらは本質的に何でもありません、あなたがそれらにどのように見えるかを決めるのはあなたです。それらを整数として表示する場合は01101010
、数値106(16進数で6Aと記述され0x6A
ます)として表示されますが、これらのビットを文字として表示する場合は、ビットは文字「j」として表示されます。
私の質問に戻ります。あなたが言うとどうなりますint x
か?行われることはたくさんあります:
int
それはいくらですか?通常は32ビットであるためint
(CPU、OSなどによって多少異なる場合があります)、メモリから32ビットを予約するように求めています。そして、それは何バイトですか?各メモリブロックは8ビットであるとすでに述べたので、4バイトのメモリを予約するように要求し、それらは連続します(たとえば、アドレス、、、を予約し00AA F000
ます00AA F001
)。これは、変数の種類が異なれば、サイズに応じてメモリに異なるバイト数を予約することを意味します。したがって、aは8ビットであるため1バイトのみを予約しますが、aは64ビットを必要とするため8バイトを予約します。00AA F002
00AA F003
char
float
これはポインタには当てはまりませんので、注意してください!ポインタにジャンプする前に、別の方法でアイデアを繰り返したいと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から)と次に使用可能なメモリ位置(アドレス)がアドレスに配置されるため、新しいアドレスがアドレスに配置されます。この場合になります。まだ私と一緒に?int
char *q; int x; q = &x;
int
char
int
AA00 FF00
AA00 FF04
int
AA00 FF00
AA00 FF03
AA00 FF04
したがって、ポインタ宣言は2つのことを意味します。
p++
に、ポインタのタイプのサイズ(バイト単位)に相当し、ポイントしているもののタイプとは関係のないブロックの数をメモリ内でジャンプします。次に例を示します。char c; int *p; p = &c;
現在、が配置p
されているメモリアドレスを指しているが、次のメモリアドレスを指していません。これは、intポインタの1ステップのサイズが原因で、初期位置から4バイト離れた場所にあるアドレスを指します。 4バイトです。c
p++
それで、何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()
すべてのプログラムで最後になるため、終了方法にのみ影響します(プログラムを終了します)。
これであなたの質問が明確になることを願っています。
「void」は「タイプなし」を意味します。関数の戻り型が「void」の場合、どの型の値も返さないことを意味します。
ただし、voidへのポインタは、特定の型のポインタではないことを意味します。このようなポインタは通常、正しい型にキャストする必要があります。
VOIDは何の意味もありません。C / C ++のvoid型へのポインターは、任意の型のポインターを指すために使用できます。関数へのポインターなど、型変換が必要なものもあります。VOIDは、タイプまたはパラメータリストがないことを意味します。