2012-01-06 2 views
0

Я взял этот кусок кода, который я скопировал в свою программу. Это, кажется, новый способ для меня, чтобы перебирать гольца **:iterate char ** почему это работает?

char** vArray;   // The array containing values 

// Go throught properties 
if(szKey == "KeyMgmt") 
{ 
    vArray = (char**)g_value_get_boxed((GValue*)value); 
    for(; vArray && *vArray ; vArray++) // Why does this work ?! 
     pWpaKey->addKeyMgmt(std::string(*vArray)); 
} 
else if(szKey == "Pairwise") 
{ 
    // ... 
} 

Похоже, работать как шарм, но я не understant почему! Предполагается, что vArray содержит адрес справа? И * vВведите значение «строка». Так почему, когда я «И» адрес с его значением, это дает мне равенство?

+1

В качестве подсказки: '&&' является логическим И, а '&' является двоичным И. –

+0

C тег заменен на C++. Не существует '::' в C. – pmg

ответ

3

условие петли

vArray && *vArray 

В основном это сокращение для

(vArray != 0) && (*vArray != 0) 

который является истинным, если char** указатель не равен нулю, и указывает на char*, который не равен нулю.

+0

mmm nice Я не предполагал, что последнее значение для * vArray было 0! Итак, первый параметр (vArray) - это просто проверка здравомыслия ... Спасибо, это намного яснее! – morandg

+0

Не только проверка здравомыслия. Если 'g_value_get_boxed()' возвращает 'NULL', и эта проверка не включена, тогда BAM! Ошибка сегментации. – ptomato

5

vArray && *vArray эквивалентно (vArray != NULL) && (*vArray != NULL)

Это первая проверка, что указатель vArray не NULL и, предполагая, что это не NULL, проверяя, что указатель он указывает не NULL.

+0

А, спасибо, @ ЭрнестФридман-Хилл. Ред. –

Смежные вопросы