Цитата
здесь что происходит? адрес значения ф-ии присваиваю указателю *initResult ?
Объясняю. Переменная указатель всегда хранит АДРЕС в памяти(просто число).
Если вам нужно сравнить адрес, то тогда нужно писать
Код
if ( initResult != 123 )
Если указатель типизированный, то к нему можно применить операцию
разыменование указателя. В Си это делается путем добавления звездочки перед именем указателя.
Т.е. если
Код
int *initResult = InitDevice();
то
Код
if( *initResult != 123 )
позволит сравнить уже не адрес, а ТО, ЧТО ЛЕЖИТ ПО ЭТОМУ АДРЕСУ В ПАМЯТИ.
Также можно и переслать значение в этот адрес.
Код
*initResult = 123;
Далее, что происходит, когда вы пишите
Код
char *msg = "message1";
На самом деле компилятор выделяет память под строку "message1" и инициализирует её этим значением "message1\0". Далее, в переменную msg поступает АДРЕС ячейки памяти в которой лежит буква m(первый символ строки).
Так почему же нельзя сравнивать строки просто в if? именно потому, что строка в си - это просто символы, пока не встретится 0.
Что происходит, когда мы пишем
Код
char *initResult = InitDevice();
if ( initResult != "SUCCESS")
а происходит по сути сравнение указателей. Компилятор берет наш "SUCCESS" и, как я уже говорил, ложит в память. Поскольку первый операнд сравнения есть указатель initResult, то и второй операнд тоже будет указателем. Указателем на первый символ('S').
А теперь представим себе, что функция сформировала в неком буфере с адресом 0x00f1 строку SUCCESS и вернула нам указатель на этот буфер(0x00f1) в нашем if() мы использовали "SUCCESS" в надежде, что компилятор сравнит строки, а на самом деле он сравнит указатели и они не могут быть равны, т.к. для "SUCCESS" компилятор выделил отдельно память, а функция использовала некий буфер и к примеру приняла туже строку "SUCCESS" с порта, но адреса точно не сойдутся - это разные области памяти, хоть и содержащие одинаковые данные. И очень обидно, что результат сравнения будет == 0

Что же делает strcmp()? А она берет первый символ одной строки и первый символ другой, сравнивает их, если они равны - переходит к следующему. И так пока не наткнется на конец одной из строк или на различие. Т.е. strcmp() сравнивает именно значения находящиеся по переданным ей указателям. strcmp() какраз использует разыменование указателей.
Да, кстати, указатели можно складывать, вычитать, умножать и делить. При этом мы делаем все эти операции с адресом, хранящимся в указателе. Так, например, можно "перенацелить" указатель с первого символа в строке, на второй. В общем то указатель можно сделать даже "из воздуха".
Код
unsigned int address = 0x001f; //адрес в памяти
unsigned int *ptr = (unsigned int *)address;
или даже так
Код
unsigned int *ptr = (unsigned int *)0x001f;
В общем тут надо бы почитать теорию )))