たとえば、次のような場合:
int *x;
x = func(a);
ステートメントの場合:x = func(a);
、アドレスをに返すと言いますx
か?または、どのように正確にそれを読みますか?
編集:私たちがポインタを返していると言うのは資格がありますx
か?もしそうなら、これがどのように正確に行われるかを説明できますか?つまり、どのようにポインタを返すのですか?
x
はへのポインタです。int
つまり、はが格納されているメモリ位置のアドレスですint
。つまり、はのアドレスを返し、それを変数に格納することx = func(a)
を意味します。func
int
x
戻り後に内容が未定義になるローカル変数のアドレスを返さないように注意してくださいfunc
。
RE: あなたの編集:
編集: x へのポインターを返していると言う資格はありますか? もしそうなら、これがどのように正確に行われるか説明できますか? つまり、どのようにポインターを返すのでしょうか?
はい、もちろん対象です。ポインターを他のデータ型として考え、扱います。内部的には、それらは単なるメモリアドレスです。ポインターは、他のデータ型を返すのと同じ方法で返すことができます。
たとえば、次のコードをご覧ください。
int* giveMeAPointer() {
return y;
}
int* x = giveMeAPointer();
「y」が「int* y = ...」としてグローバルに宣言されているとします。これで、"x" が指すメモリ アドレスは、"y" が指すメモリ アドレスと同じになります。
ここで、"y" がポインターとしてではなく、通常の int として宣言されたとします (例: "int y = 5")。関数はこれを行うことができ、それでも有効です。
int* giveMeAPointer() {
int* result = &y;
return result;
}
*x
メモリ内の int 型変数へのポイントです。したがって、関数func
はアドレスを int に返す必要があります。
int *x;
x = new int; // create your own int
*x = 5; // access - set it's value
delete x; // delete int - free memory
x = getGlobalCounter();
(*x)++; // increment global pointer
たとえば、getGlobalCounter 関数:
static int counter;
int *getGlobalCounter() {
return &counter; // return address of counter
}
しかし、関数から返されたオブジェクトを削除することは常に良い考えではありません。その場合、上の例のようにカウンターが動的に割り当てられないため、実行時エラーが発生するはずint
です。
変数の値を関数の戻り値の型に割り当てる場合、その戻り値の型は変数の型と一致する必要があります。これはポインタでも同じです。
したがって、次の場合:
int* myPointer;
と...
int* func();
次に、myPointer を func() に等しく設定すると、"myPointer" が指すメモリ アドレスが func() によって返されるメモリ アドレスに変更されます。
このステートメントは、xに関数によって返される値が割り当てられていることを示していますfunc
。コードをエラーなしでコンパイルするには、funcはアドレスを返す必要があります。AlexFZ
そして、指摘されたようにコードが期待どおりに実行されるようにするfunc
には、関数にローカルな変数のアドレスを返さないように注意する必要があります。
xは、特にintへのポインタです。したがって、2つのメモリ位置が使用されていることは明らかです。1つはポインタ用で、もう1つはそれが指しているメモリ用です(ポインタがnullでない場合)。
ポインタ自体がメモリアドレス、具体的にはそれが指しているメモリの場所を保持します。0xa456e4faのようなもの。
はい、func()はポインタを返しています。funcのプロトタイプは次のようになります。
int * func(someObj a); //I don't know the datatype of your parameter,
//so I'm just making something up.
戻り値の型がintへのポインタであることに注意してください。これと私が以前に言ったことから、これが何を返すかは明らかなはずです。0xyyyyyyの形式の何か、またはメモリアドレス/ポインタ。そのメモリアドレスはxポインタに入ります。
ポインタ自体は、それが指しているデータを保持しておらず、アドレスだけであることに注意してください。ポインタを返すことができない理由は本当にありません。ただし、何を返すかについては注意が必要です。関数の実行が完了すると、その変数はスコープ外になるため、ローカル変数のアドレスを返したくありません。その後、無効なもののアドレスを返します。ただし、ローカルポインタのVALUEを返すことは問題ありません。これは、返した値(アドレス)が、それが指しているメモリと同様に保持されるためです。
私もあなたに本を書いたことに気づきました。くそー、私は疲れているときに確かに散歩します。
これは、func() が int* 型の変数を返すことを意味します。
x へのポインターを返していると言う資格はありますか?
いいえ、整数へのポインタを返し、それを x に代入しています。これはポインタであるためです。
これは、int ポインターを返すサンプル コードです。
int* func(int a)
{
int *y = &a;
return y;
}