Что такое указатели
Для чего нужны указатели? Указатели появились, прежде всего, для нужд системного программирования. Поскольку язык С предназначался для "низкоуровневого" программирования, на нем нужно было обращаться например, к регистрам устройств. У этих регистров вполне определенные адреса, т.е. необходимо было прочитать или записать значение по определённому адресу. Благодаря механизму указателей, такие операции не требуют никаких дополнительных средств языка. Указатели позволяют существенно упростить и ускорить ряд операций. Предположим, в программе имеется область памяти для хранения промежуточных результатов вычислений. Эту область памяти используют разные функции программы. Вместо того, чтобы каждый раз при обращении к функции копировать эту область памяти, мы можем передавать указатель на эту память в качестве аргумента вызова функции, тем самым упрощая и ускоряя вычисления Правильное понимание и использование указателей необходимо для составления хороших программ на языке С/С++ по следующим причинам: Во-первых, указатели являются средством, с помощью которого функции могут изменить значения передаваемых в неё аргументов. Во-вторых, с помощью указателей выполняется динамическое распределение памяти. В-третьих, указатели позволяют повысить эффективность многих процедур. В-четвёртых, указатели обеспечивают выполнение динамических процедур, таких как динамические деревья и связные списки. Указатель – это переменная, значением которой является адрес некоторого объекта (переменной) в памяти компьютера. Если одна переменная содержит адрес другой переменной, то говорят, что первая переменная указывает (ссылается) на вторую.
Рис. 1. Одна переменная ссылается на другую С помощью указателя осуществляется так называемая косвенная адресация (indirection), т.к. он не связан напрямую с данными в памяти. Объявление указателя состоит из имени базового типа, символа * и имени переменной. Общая форма объявления указателя: тип *имя; тип – базовый тип указателя, определяет тип объекта, на который указатель будет ссылаться. имя – определяет имя переменной-указателя. Символ (*) определяет саму переменную как указатель. Тип необходимо указывать потому, что переменные разных типов занимают различное число ячеек памяти, а для некоторых операций адресной арифметики указателей требуется знать объём отведённой памяти. Примеры правильных объявлений: int *pi; //указатель на переменную типа целого; Вариант 1 char *pc; // указатель на символьную переменную; float *pf; // указатель на переменную с плавающей точкой;
int *pi1, *pi2; //2 указателя на переменную типа целого; Вариант 2 char *pca, *pcd; //2 указателя на символьную переменную; float *pff, *pfd; //2 указателя на переменную с плавающей точкой;
В одном операторе объявления можно одновременно объявить и указатель, и переменную, не являющуюся указателем. Int x, *y, count; // x и count переменные, *y указатель. Величины типа указатель подчиняются общим правилам определения области видимости, действия и времени жизни.
|