そこまで私はその方法を信頼していました
bool solverMethod::buildSimplex(double** simplex_ , double* funcEvals_, double* initPt_)
{
// things
}
呼び出されたメソッドのシンプレックス、funcEvals_、initPt_ の値を変更します (ポインターによる通過)。私が間違っている?それをどのように置くのですか?
簡単な質問で申し訳ありません。
そこまで私はその方法を信頼していました
bool solverMethod::buildSimplex(double** simplex_ , double* funcEvals_, double* initPt_)
{
// things
}
呼び出されたメソッドのシンプレックス、funcEvals_、initPt_ の値を変更します (ポインターによる通過)。私が間違っている?それをどのように置くのですか?
簡単な質問で申し訳ありません。
これは、ポインター、参照、および参照セマンティクスの一般的な説明であるため、答えではないかもしれません。
関数に渡される引数オブジェクトを変更できる場合、その関数は参照セマンティクスを持つと言われます。たとえばswap
、値を交換する場合、次の関数には参照セマンティクスがあります。
int x = 4;
int y = 8;
swap(x, y);
assert(x == 8 && y == 4);
問題は、参照セマンティクスをどのように実装するかです。C++ には、これを非常に自然にするネイティブ参照型があります。
void swap(int & a, int & b) { int t = a; a = b; b = t; }
対照的に、C にはそのようなネイティブ機能がなく、C のすべてのオブジェクトは値渡しされます。ただし、C には、参照セマンティクス、つまりポインターの実装に使用できる別の機能があります。すべての typeには、関連する type があり、その値はtype :のオブジェクトのアドレスを取得することで取得できます。これで、これらのポインター オブジェクトを値で渡し、それらを使用して、それらが指す元のオブジェクトにアクセスできるようになりました。ポインターを値渡ししていることに注意してください。T
T*
T
int x; int * p = &x;
void c_swap(int * p, int * q) { int t = *p; *p = *q; *q = t; }
関数を別の方法で呼び出す必要があります: swap(&x, &y)
. したがって、C では、引数が変更されているかどうかを常に知ることができます。これを行う唯一の方法は、そのアドレスを関数に渡すことです。C++ では、参照または値のセマンティクスが適切に配置されているかどうかを知るために、実際の関数シグネチャを知る必要があります。