関数に渡された変数のアドレスの戻り値を取得するには、どの戻り値と変数の型を使用する必要がありますか?
言う:
RETURNTYPE get_address(int num){
return #
}
int main(){
int num = 1;
DATATYPE = get_address(num);
return 0;
}
関数に渡された変数のアドレスの戻り値を取得するには、どの戻り値と変数の型を使用する必要がありますか?
言う:
RETURNTYPE get_address(int num){
return #
}
int main(){
int num = 1;
DATATYPE = get_address(num);
return 0;
}
RETURNTYPE と DATATYPE は である必要がありint*
ますが、関数の引数へのポインターを返すことはあまり意味がないことに注意してください。
関数の引数は、関数が実行されている間のみ存在します。関数がその変数を返すと、もはや存在せず、返されたアドレスを使用することは、本質的に未定義の動作です。
呼び出しサイトで引数として使用される変数のアドレスが必要な場合は、関数はまったく必要ありません。演算子get_address()
を使用するだけです。&
int main(){
int num = 1;
int* pnum = #
return 0;
}
C ++ 11にアクセスできる場合は、組み込みのstd::addressofを使用できます。
パラメータのアドレスを次のように返すジェネリック関数を実装できます。
template<typename T>
T* addr(T& param)
{
return (T*)&(char&)param;
}
(これはC ++ 11の実装であり、単項&
がオーバーロードされる可能性があるため、このようになります)
パラメータを参照で渡す必要があることに注意してください。そうしないと、ローカル変数のアドレスが返され、未定義の動作が発生する可能性があります。
または、単にを使用することもできます&
。:)
numのアドレスが、値で渡されたときに関数の内部と外部で異なることを確認する必要があります。
同じパラメータを値と参照で渡すことができます。
void compareAddresses(int passedByValue, int& passedByReference)
{
std::cout << &passedByValue << " " << &passedByReference;
}
ポインタは、アドレスを保持する変数です。したがって、intへのポインタが必要です。
int* get_address (int num) {
return #
}
int main () {
int num = 1;
int* pointer = get_address(num);
return 0;
}
値をコピーで渡すと、変数がスタックから割り当て解除され、ポインターが無効になるため、上記の方法はもちろん機能しません。
関数が必要な場合は、参照渡しする必要があります (これにより、変数の正しいポインター アドレスが返されます)。
int* get_address (int &num) {
return #
}
関数は必要ありませんが。少し過剰です。それはうまくいきます:
int* pointer = #
ローカルスコープの変数のアドレスは、関数が戻った後に存在しなくなるため、返すことはできません。むしろ、返すべきではありません。したがって、あなたはゴミだけを手に入れています。
int num = 1;
int* addr = #
C ++ 11では、タイプがわからない場合はautoを使用できますが、関数からautoを返すことはできません。
auto num = 1;
auto addr = #
関数が終了すると、ローカル変数は破棄されます。関数呼び出しは、他の関数呼び出しによって上書きされる可能性があります。欲しいものは手に入らない。したがって、関数のローカル変数へのポインターを返すべきではありません。