Скачать презентацию Указатель — это поименованный адрес памяти компьютера В Скачать презентацию Указатель — это поименованный адрес памяти компьютера В

указатели.ppt

  • Количество слайдов: 17

Указатель - это поименованный адрес памяти компьютера. В Си – программах адресам переменных могут Указатель - это поименованный адрес памяти компьютера. В Си – программах адресам переменных могут быть даны имена, что позволяет обращаться к переменным, используя их символическое обозначение.

указатель не является самостоятельным типом, он всегда связан с каким-либо базовым типом данных. Базовый указатель не является самостоятельным типом, он всегда связан с каким-либо базовым типом данных. Базовый тип определяет тип того значения, на которое «ссылается» указатель.

примеры объявления переменных, способных хранить адреса памяти: int *p. Int; // указатель на значение примеры объявления переменных, способных хранить адреса памяти: int *p. Int; // указатель на значение целого типа char *p. Char; // указатель на значение символьного типа void *p. Void; // указатель неопределенного типа // (может указывать на значение любого типа)

Часто сами переменные типа указатель называют указателями. Над указателями-переменными возможны следующие операции: – операции Часто сами переменные типа указатель называют указателями. Над указателями-переменными возможны следующие операции: – операции инициализации, присваивания (=), взятия адреса (&); – операция разыменовывания (разадресации) указателя или взятия значения переменной по указателю (*); – арифметические операции (+, ++, -, --); – операции сравнения (==, !=, >, <, >=, <=); – операция явного приведения типов.

Другой способ инициализации указателя – инициализация адресом переменной: int A; // переменная располагается по Другой способ инициализации указателя – инициализация адресом переменной: int A; // переменная располагается по // адресу 0 x 0012 FF 5 C int *p. Int= &A; // инициализация // адресом переменной A: p. Int= 0 x 0012 FF 5 C В этом случае используется специальная операция взятия адреса &, которая возвращает адрес указанной переменной.

Разыменовывание указателя Операция разыменовывания указателя * позволяет обратиться к значению, хранящемуся по заданному адресу. Разыменовывание указателя Операция разыменовывания указателя * позволяет обратиться к значению, хранящемуся по заданному адресу.

пример обращения к переменной A через указатель p. Int (который хранит адрес этой переменной). пример обращения к переменной 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; // записываем в int Mass[5]= {1, 2, 3, 4, 5}; int *p. Mass= Mass; // записываем в p. Mass адрес первого элемента массива // Две идентичные по смыслу записи printf(“%d”, *(p. Mass+1)); // печатаем второй элемент массива printf(“%d”, *(Mass+1)); // печатаем второй элемент массива

Тесная связь массивов и указателей позволяет заменить выражение *(<адрес ячейки> + i) на операцию Тесная связь массивов и указателей позволяет заменить выражение *(<адрес ячейки> + i) на операцию []. Рассмотрим пример такой замены: int Mass[5]= {1, 2, 3, 4, 5}; int *p. Mass= Mass; // записываем в p. Mass адрес первого элемента массива printf(“%d”, p. Mass[1]); // печатаем второй элемент массива

Cвязь массивов с указателями позволяет работать с многомерными массивами как с одномерными. Как известно, Cвязь массивов с указателями позволяет работать с многомерными массивами как с одномерными. Как известно, многомерный массив располагается в памяти линейно. Поэтому, получив указатель на первый элемент многомерного массива, далее его можно рассматривать как одномерный. В некоторых случаях это упрощает реализацию программы

#define M 2 #define N 3 int Mass[M][N]= {{1, 1, 1}, {2, 2, 2}}; #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]); }

Массивы указателей Указатели, как и переменные любого другого типа, могут объединяться в массивы. Массивы указателей Указатели, как и переменные любого другого типа, могут объединяться в массивы.