Уважаемые господа, sergeeff и rezident.
То что указатель содержит адрес ячейки памяти, в которой храниться значение переменной
на которую этот указатель указывае - это азы Си. И они мне уверяю вас известны.
А то что модификатор voltile в обьявлениии указателя может указывать что указатель, так сказать волатильный( т.е. может измениться не только из программы, как регистры переферии ), и может
модификатор voltile указывать что указатель указывае на волатильную перменную.
Вот цитата из прервода документации по компилятору HT-PICC:
"Чтобы четче определить поведение и особенности указателя и объекта на который он
указывает можно комбинировать различные квалификаторы. К наиболее часто употребимым
квалификаторам относятся const, volatile, persistent. Применяя комбинации этих
квалификаторов необходимо следить за соответствием (отсутствием противоречий)
квалификаторов, оказывающих воздействие на свойства собственно указателя и объекта на
котрый он указывает. Правила, которые помогут сделать все правильно, просты: если
квалификатор находится слева от “*” в описании указателя, то он воздействует на объект,
адресуемый указателем. Если квалификатор находится справа, то он воздействует на
собственно указатель. Проиллюстрируем это примерами:
volatile char * nptr;
объявляет указатель на volatile символ. Другими словами в этом примере квалификатор
воздействует на объект, адресуемый указателем nptr.
char * volatile ptr;
так как квалификатор располагается справа от “*”, то он будет воздействовать на
собственно указатель ptr, а не на объект. И заключительный пример по этому поводу:
volatile char * volatile nnptr;
теперь будет описан volatile указатель на volatile переменную.
Рассмотрим некоторые аспекты применения константных указателей. Они применяются
для косвенного обращения к переменным описанным как const. В общем их поведение
(константных указателей) не отличается от поведения обычных указателей, но компилятор
препятствует выполнению операций записи с использованием этих указателей. Вот
несколько примеров:
const char * cptr;
при этом выражение:
char ch = *cptr;
абсолютно легально, в то время как выражение:
*cptr = ch;
недопустимо и вызовет ошибку"Судя по тому что написано в описании, я совершенно правильно использовал квалификатор volatile,
а то что сам указатель не меняется так это тоже верно.
А я написал функцию которая выполняет антидребезг. И передаю в нее время , в течении которого проводить проверку на дребезг, и так же передаю в функцию структуру которая содержит информацию о пине. Так как антидребезг мы можем производить для любой из ножек контроллера к которой подклюен датчик или кнопка.
Так вот я мог бы пердавать в функцию явно номер пина RA0 или RC5 и это бы работало.
А если передавать структуру, в которой одним из полей будет номер пина (RA0 или RC5)
то функция работает некоретно. И вот вопрос ПОЧЕМУ???
Кстати я пробовал работать и без указателей, тоже ничего не выходит, если номер пина я вляется полем структуры - так что видите что вазговоры о том что указатель волатильный, а сама переменная нет, по моему беспочвенны.
Хотя быть может вы меня переубедите, если предложите другие аргументы.