реклама на сайте
подробности

 
 
> непонятность с указателями
Метценгерштейн
сообщение May 11 2010, 14:32
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



char *initResult = InitDevice();
if ( initResult != "SUCCESS")
{
return initResult;
}

задавал вопрос на телесистемах, ничего вразумительного не получил в ответ

здесь что происходит? адрес значения ф-ии присваиваю указателю *initResult ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sigmaN
сообщение May 12 2010, 03:50
Сообщение #2


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
здесь что происходит? адрес значения ф-ии присваиваю указателю *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 sad.gif

Что же делает strcmp()? А она берет первый символ одной строки и первый символ другой, сравнивает их, если они равны - переходит к следующему. И так пока не наткнется на конец одной из строк или на различие. Т.е. strcmp() сравнивает именно значения находящиеся по переданным ей указателям. strcmp() какраз использует разыменование указателей.

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


В общем тут надо бы почитать теорию )))


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Метценгерштейн   непонятность с указателями   May 11 2010, 14:32
- - kamil yaminov   строки нельзя просто так сравнить, надо использова...   May 11 2010, 14:40
- - Метценгерштейн   хорошо, если это не строки, а числа, например int...   May 11 2010, 14:43
- - kamil yaminov   Возвращаемое функцией значение, помещается в памят...   May 11 2010, 14:48
- - Andron_   в initResult записывается некий адрес *хз ваще, че...   May 11 2010, 14:53
- - Метценгерштейн   а правильно было бы сравнивать два числа так: int...   May 11 2010, 14:55
- - Andron_   Цитататеперь, если результат по адресу на кот. ука...   May 11 2010, 14:58
- - Метценгерштейн   спасибо, мне идею надо было понять с указателями и...   May 11 2010, 15:01
- - Палыч   Цитата(Метценгерштейн @ May 11 2010, 18:3...   May 11 2010, 15:02
- - Dima_G   Мне кажется, проще объяснить так Кодconst char* G...   May 12 2010, 03:17
|- - Dima_G   Цитата(sigmaN @ May 12 2010, 10:50) Да, к...   May 12 2010, 04:04
- - sigmaN   Пардон, немножко переборщил. )) Их можно только в...   May 12 2010, 04:47
- - mdmitry   Может быть Кодchar *initResult = InitDevice(...   May 12 2010, 12:21
- - theBMV   Товарисчи, а ИМХО, отработав, все локальные перем...   May 20 2010, 07:17
- - rezident   Цитата(theBMV @ May 20 2010, 13:17) Товар...   May 20 2010, 14:39


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01376 секунд с 7
ELECTRONIX ©2004-2016