C++ポインタ(2)
続いてC++ポインタ(1)に説明しましょう
何を処理するかをもう一度見てみましょう.
動的割当てアレイの場合は である.ポインタをパラメータとする関数を定義する場合は、 を使用します.ポインタを返す関数を定義する場合: 最初のプロジェクト配列を動的に割り当てる場合,前回の位置決めで議論したが,今回の位置決めでは次の2つのプロジェクトの処理を試みる.
まず、ポインタをパラメータとする関数を見てみましょう.
この場合、関数を定義するときパラメータを使用して、変数のアドレス値をnおよび にコピーします.関数の呼び出し時にパラメータを渡す方法
焦点を合わせる より具体的に理解するために、次のコードを見てみましょう.
関数呼び出し方法2は、変数yのアドレス値を関数のパラメータに直接渡す.
次の図は、上記のコードで関数を簡単に定義して実行した結果を示しています.
出力結果から,関数呼び出し方法1と関数呼び出し方法2はいずれもnに同じアドレス値を格納していることがわかる.
また、出力*nであれば、出力がnで示す実値10であると判定することができる.
また、*nの値を変更することで、main関数で宣言されたyの実際の値も変更されると判断できます.
.
.
.
次に、ポインタを返す関数を見てみましょう.
戻りポインタはアドレス値を返すと理解される. ポインタを返すので、関数の戻りタイプがポインタとして宣言されていることがわかります.
ポインタを返す場合:を返すアドレス値はどのように定義されますか?
フォーカスを合わせます. すぐにコードを見てください.
ただし、この場合、コンパイル後に次の警告メッセージが出力されます.
これは、関数の実行が終了すると、変数pがメモリから消えるため、変数pが関数内部で「領域変数」として宣言されるメッセージです.
この問題を解決するには、アドレス値を返すために次のように定義する必要があります.
コードを見てください.方法1
関数内部は、動的に割り当てられたアドレスを返すように定義されます.
動的割り当てにより、pはメモリ上の任意の位置を指し、その位置にx+1の値を格納する.
そして、その位置のアドレス値を返すと、関数を実行すると結果がわかります.方法2
関数内部は、宣言された領域変数xを返すアドレス値として定義される.
ここでちょっと待って.
メソッド2は、領域変数のアドレス値を返します.
func()関数内部で宣言された領域変数xはfunc()関数の実行が完了すると破棄されます.
これは、前述のエラー例で説明した場合と同様です.
ただし,関数をコンパイルして実行すると,メソッド1のように結果が正常に出力されているかどうかを調べることができる.
位置付けをして、原因を見つけようとしたが、正確に把握できなかった.しかし、予想できる部分があり、説明したいと思います.エラー例 方法2
簡単に言えば、方法2は、領域変数xのアドレス値をポインタ変数pに格納する.
したがって,関数の実行が完了してもxが消失しても,pはその位置を指す.
しかし,xのアドレス値を格納しても,xの値が消えるかどうかは説明できない.
この点については、これからも考え続けるかもしれません.
読んでくれてありがとう誤字または誤字の情報があればメッセージを残してください
何を処理するかをもう一度見てみましょう.
動的割当て
まず、ポインタをパラメータとする関数を見てみましょう.
void func(int* n) { ... }
上記のコードについて,int型ポインタ変数をパラメータとする関数を定義した.この場合、関数を定義するとき
焦点を合わせる
func(int *n) { ... } // 함수 정의
int y = 10;
int *x = &y; // 포인터 변수 정의
func(x); // 함수 호출 방법 1
func(&y); // 함수 호출 방법 2
関数呼び出し方法1は、ポインタ変数xを関数のパラメータとして渡し、xに格納された値である変数yのアドレス値をポインタ変数nにコピーすることにより関数を呼び出す.関数呼び出し方法2は、変数yのアドレス値を関数のパラメータに直接渡す.
int *n = &y;
コールは上記のように行います.次の図は、上記のコードで関数を簡単に定義して実行した結果を示しています.
出力結果から,関数呼び出し方法1と関数呼び出し方法2はいずれもnに同じアドレス値を格納していることがわかる.
また、出力*nであれば、出力がnで示す実値10であると判定することができる.
また、*nの値を変更することで、main関数で宣言されたyの実際の値も変更されると判断できます.
.
.
.
次に、ポインタを返す関数を見てみましょう.
戻りポインタは
ポインタを返す場合:
フォーカスを合わせます.
int *func(int x) {
int p = x + 1;
return &p;
}
上記の場合、変数pを返すアドレス値として定義される.ただし、この場合、コンパイル後に次の警告メッセージが出力されます.
これは、関数の実行が終了すると、変数pがメモリから消えるため、変数pが関数内部で「領域変数」として宣言されるメッセージです.
この問題を解決するには、アドレス値を返すために次のように定義する必要があります.
コードを見てください.
int *func(int x) {
int *p = new int; // 동적 할당
*p = x + 1;
return p;
}
方法1では、関数内部は、動的に割り当てられたアドレスを返すように定義されます.
動的割り当てにより、pはメモリ上の任意の位置を指し、その位置にx+1の値を格納する.
そして、その位置のアドレス値を返すと、関数を実行すると結果がわかります.
int *func(int x) {
int *p = &x;
*p = x + 1;
return p;
}
方法2:関数内部は、宣言された領域変数xを返すアドレス値として定義される.
ここでちょっと待って.
メソッド2は、領域変数のアドレス値を返します.
func()関数内部で宣言された領域変数xはfunc()関数の実行が完了すると破棄されます.
これは、前述のエラー例で説明した場合と同様です.
ただし,関数をコンパイルして実行すると,メソッド1のように結果が正常に出力されているかどうかを調べることができる.
位置付けをして、原因を見つけようとしたが、正確に把握できなかった.しかし、予想できる部分があり、説明したいと思います.
int *func(int x) {
int p = x + 1;
return &p;
}
int *func(int x) {
int *p = &x;
*p = x + 1;
return p;
}
エラー例のコードとメソッド2のコードの違いから,記憶領域変数のアドレス値に違いがある.簡単に言えば、方法2は、領域変数xのアドレス値をポインタ変数pに格納する.
したがって,関数の実行が完了してもxが消失しても,pはその位置を指す.
しかし,xのアドレス値を格納しても,xの値が消えるかどうかは説明できない.
この点については、これからも考え続けるかもしれません.
C++ポインタ[終了]
読んでくれてありがとう
Reference
この問題について(C++ポインタ(2)), 我々は、より多くの情報をここで見つけました https://velog.io/@sjongyuuu/기억하기-C-포인터2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol