2012-02-28 20 views
0

私には奇妙に聞こえるコードサンプルを読んでいます:ダブルポインタのブール値

メソッドの引数はdoubleへのポインタです。メソッド本体には、この引数ポインタが与えられているかどうかをテストする条件文があります(空かどうか)。ポインタがどのようにbool値を持つことができるのか、存在しないポインタ(NULL?0?)の構文は何ですか?ここ

は、メソッドの実装である:C++で

bool OMethod::initSim(double* alpha_) 
{ 
int i, j; 
const double * cparameters = fun->getParameters(); 
simplex = OMatrix::allocMatrix(npts,ndim,true); 
sSum = new double[ndim]; 
funcEvals = new double[npts]; 
double *alpha = 0; 
    if(!alpha_) { 
alpha = new double[ndim]; 
    for(i = 0; i< ndim; ++i) { 
    if(cparameters[i] == 0) 
     alpha[i] = 0.2f; 
    else 
     alpha[i] = 0.1 * cparameters[i]; 
     } 
} 
else 
{ 
    alpha = alpha_; 
} 

    for(j = 0; j < npts; ++j) 
{ 
    for(i = 0; i < ndim; ++i) 
    sim[j][i] = cparameters[i] 
     } 

delete [] cparameters; 

for(j = 0; j < ndim; ++j) 
{ 
    sim[j + 1][j] += alpha[j]; 
} 

computeS(); 

for(i = 0; i < npts; ++i) 
{ 
    funcEvals[i] = evalFunc(simplex[i]);  
    } 

答えて

3

、それがゼロに等しくない場合、ポインタ値はブールコンテキスト(例えばif試験又は!式で)に「真」であると考えられます、つまり、nullではありません。したがって、!alphaは、alpha == 0,alpha == NULLおよびalpha == nullptrと同じです。

0

!を書くことによって、C++で0(またはポインタの場合はNULL)に対して任意の値をテストできます。

0

単純型への通常のポインタの場合、if (!pointer)if (pointer==NULL)に相当します。

1

ポインタの値が0(NULL)かどうかをチェックします。 if (alpha_)の部分はif (alpha_ != 0)と書くこともできます。 '

例:

int *add(int *array, int n, int *sum) { 
    if (sum == 0) { 
    sum = new int; 
    *sum = 0; 
    } 
    *sum += array[0]; 
    if (n > 0) 
    add(array+1, n-1, sum); 
    return sum; 
} 

main() { 
    int a[] = {1,2,3}; 
    int *sum = 0; 
    sum = add(a, 3, sum); 
    // ... 
    delete sum; 
}