Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Программа указателями никак не управляет.;)

Отправлено Vit (77.123.106.1) 08 мая 2010, г. 10:29
В ответ на: VasilyS, вот обсуждали мы с тобой указатели, и ты все время ссылаешься на компилятор, отправлено Двоешник 08 мая 2010, г. 02:27

для понимания Вами работы с указателями Вам необходимо понять, что такое тип данных. В первом приближении это всего лишь размер. Указатель это переменная, размер которой которой позволяет хранить адрес переменной. Например, в С51 адрес переменной это обычно 24-хбитная переменная, потому как обычно используется внешняя память с адресацией 16 бит, да ещё на борту есть ещё пара-другая небольших сегментов - в старшем байте указывается номер сегмента, принятый в компиляторе. В зависимости от конкретного случая настройки типы адресации могут разниться. В AVR вроде как проще, но эта простота стОит отсутствия в WinAVR модификатора __generic, имеющегося в IAR, позволяющего практически одинаково обращаться с указателями на ОЗУ и на FLASH - такое удобство, естественно стОит определённого оверхеда.
Далее Вам стОит узнать, что обращение по указателю это есть всего лишь обращение по адресу, записанному в этот указатель с определённым смещением. Т.е. когда мы обращаемся *ptr, то смещение равно нулю, а вот когда мы обращаемся *(ptr+2), то это значит, что мы обращаемся по адресу со смещением, равным 2 умножить на размер типа, за которым объявлен указатель. Т.е. если мы имеем указатель на структуру, то если у нас есть массив структур, мы можем оперировать его значениями
<C>
typedef struct {
int x;
char y;
}st;
st * ptr;
st array[10]={....};
void foo(void){
ptr = array; //что практически равнозначно ptr = &array[0];

*(ptr) = *(ptr+5); //копирование 5-го эл-та массива в 0-й
...
}
</C>
Через указатели на структуры (точнее на переменные составных типов) можно оперировать членами этих структур. Для обращения по указателю компилятор опять же либо выполняет вычисление смещения на этапе компиляции(подставляет вычисленную константу), либо организовывает вычисление смещения при выполнении программы (в runtime). Т.е. для вычисления смещения к array[5].y (по указателю это (*(ptr+5)).y или (ptr+5)->y ) принимают участие 2 составляющие - смещение на 5 размеров структуры st и смещение от базового адреса до элемента y в структуре st. Запись (ptr+5)->y, IMHO, буквально соответствует "обратиться со смещением 5 от указателя и внутренним смещением до элемента y". Естественно, тип значения должен быть как для элемента y (в примере char).
Вычисление смещения относится к "адресной арифметике"


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
поделите 4 пополам:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru