|
Указатели
Основы языка Си
(Указатели)
В языке Си заложена возможность определения отдельного класса переменных, которые называются указателями. Также предусмотрены операции, которые могут
быть использованы для доступа к этим указателям и для манипулирования ими.
Указателем называется переменная, предназначенная для хранения адреса другой переменной. Например, указатель однобайтовой переменной содержит в себе адрес переменной типа char. Указатели могут применяться для упрощения манипулирования массивами, структурами и другими блоками данных, а также для доступа к
конкретным физическим ячейкам памяти микроконтроллерных систем. Именно это
свойство языка Си делает его столь популярным среди сообщества разработчиков
встраиваемых систем.
Для определения переменнойуказателя используется оператор *: int *ptr.
Приведенная запись означает, что переменная ptr содержит в себе адрес старшего байта двухбайтовой переменной типа int. Переменнаяуказатель может
быть определена для адресации различных типов переменных: целочисленных
однобайтовых типа char и двухбайтовых типа int, одномерных и многомерных
массивов из переменных char или int, одиночных переменных или массивов из
элементов в формате с плавающей запятой, а также для структур, определенных
пользователем. Спецификация типа указателя информирует компилятор о размере и типе объекта, на который показывает указатель. Таким образом, при обращении к любой области памяти через указатель, содержимое этой области будет трактоваться в соответствие с заданным типом указателя. В микроконтроллерах, поддерживающих различные способы формирования адресов объектов,
спецификация типа может влиять на размер области памяти, отводимой для
хранения указателя.
Применение указателей в реальных программах требует особого внимания
программистов, поскольку именно с указателями связано основное количество
ошибок в исходном тексте программы на Си. При манипулировании указателями, а также при выполнении операций присваивания следует убедиться в корректном использовании различных типов переменных. Приведем пример применения указателя:
1 void main(void)
2 {
3 char *ptr;
4 static char message[] = «What a wonderful day!»;
5 ptr = message;
6 printf(«%s\n», ptr);
7 }
|
В этом примере переменная ptr была определена как указатель для однобайтовой
переменной типа char. Поэтому переменная ptr должна содержать 16-разрядный адрес однобайтовой переменной. В строке 4 примера был определен и инициализирован массив однобайтовых переменных message. Этот массив содержит 22 элемента:
21 символ в кодах ASCII и один байт признака конца строки. Выражение в строке 5
имеет своей целью запись в переменную ptr начального адреса массива message, т.е.
адреса символа «W». Выражение, записанное в строке 6, должно начать вывод на экран монитора символа, на который указывает содержимое переменной-указателя
ptr.
|
|
|