Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
для понимания Вами работы с указателями Вам необходимо понять, что такое тип данных. В первом приближении это всего лишь размер. Указатель это переменная, размер которой которой позволяет хранить адрес переменной. Например, в С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).
Вычисление смещения относится к "адресной арифметике"
Составить ответ | Вернуться на конференцию
Ответы