указатели.ppt
- Количество слайдов: 17
Указатель - это поименованный адрес памяти компьютера. В Си – программах адресам переменных могут быть даны имена, что позволяет обращаться к переменным, используя их символическое обозначение.
указатель не является самостоятельным типом, он всегда связан с каким-либо базовым типом данных. Базовый тип определяет тип того значения, на которое «ссылается» указатель.
примеры объявления переменных, способных хранить адреса памяти: int *p. Int; // указатель на значение целого типа char *p. Char; // указатель на значение символьного типа void *p. Void; // указатель неопределенного типа // (может указывать на значение любого типа)
Часто сами переменные типа указатель называют указателями. Над указателями-переменными возможны следующие операции: – операции инициализации, присваивания (=), взятия адреса (&); – операция разыменовывания (разадресации) указателя или взятия значения переменной по указателю (*); – арифметические операции (+, ++, -, --); – операции сравнения (==, !=, >, <, >=, <=); – операция явного приведения типов.
Другой способ инициализации указателя – инициализация адресом переменной: int A; // переменная располагается по // адресу 0 x 0012 FF 5 C int *p. Int= &A; // инициализация // адресом переменной A: p. Int= 0 x 0012 FF 5 C В этом случае используется специальная операция взятия адреса &, которая возвращает адрес указанной переменной.
Разыменовывание указателя Операция разыменовывания указателя * позволяет обратиться к значению, хранящемуся по заданному адресу.
пример обращения к переменной A через указатель p. Int (который хранит адрес этой переменной). int A; int * p. Int= &A; int A= 5; // переменной A // присваивается значение 5 *p. Int= 5; // в ячейку // памяти с адресом p. Int // записывается значение 5
Замечание. В языке Си символ * имеет многозначный смысл. В зависимости от контекста этот символ воспринимается как операция умножения, операция разыменовывания или объявление переменной типа указатель.
Сравнение указателей К указателям применимы все шесть операций сравнения: ==, !=, >, <, >=, <=. Сравнение p. Int 1 < p. Int 2 означает, что адрес, находящийся в p. Int 1, меньше адреса, находящегося в p. Int 2. Если p. Int 1 и p. Int 2 указывают на элементы одного массива, то индекс элемента, на который указывает p. Int 1, меньше индекса того элемента, на который указывает p. Int 2.
Арифметика указателя Арифметические операции (+, ++, -, --) над указателем используются для доступа к данным, которые в памяти размещаются последовательно. Они позволяют, зная адрес некоторой ячейки памяти, вычислить адреса смежных ячеек.
адреса ячеек памяти определяются с учетом базового типа данных, т. е. в общем случае выражение (<адрес ячейки> + i) вычисляется по следующей формуле: (<адрес ячейки> + i) = <адрес ячейки> + i*<кол-во байт памяти базового типа данных>
Связь массивов и указателей В языке Си имеется важная связь между массивами и указателями: принято считать, что идентификатор массива является константным указателем на его нулевой элемент.
int Mass[5]= {1, 2, 3, 4, 5}; int *p. Mass= Mass; // записываем в p. Mass адрес первого элемента массива // Две идентичные по смыслу записи printf(“%d”, *(p. Mass+1)); // печатаем второй элемент массива printf(“%d”, *(Mass+1)); // печатаем второй элемент массива
Тесная связь массивов и указателей позволяет заменить выражение *(<адрес ячейки> + i) на операцию []. Рассмотрим пример такой замены: int Mass[5]= {1, 2, 3, 4, 5}; int *p. Mass= Mass; // записываем в p. Mass адрес первого элемента массива printf(“%d”, p. Mass[1]); // печатаем второй элемент массива
Cвязь массивов с указателями позволяет работать с многомерными массивами как с одномерными. Как известно, многомерный массив располагается в памяти линейно. Поэтому, получив указатель на первый элемент многомерного массива, далее его можно рассматривать как одномерный. В некоторых случаях это упрощает реализацию программы
#define M 2 #define N 3 int Mass[M][N]= {{1, 1, 1}, {2, 2, 2}}; int *Element; // Печать всех элементов массива Element= (int *)Mass; for(i= 0; i <= M*N-1; i++) { printf(“%d”, Element[i]); }
Массивы указателей Указатели, как и переменные любого другого типа, могут объединяться в массивы.