Указатели. Общие сведениях об указателях

Содержание

Слайд 2

Общие сведениях об указателях

указатель - переменная, которая содержит адрес другой переменной
Указуемая

Общие сведениях об указателях указатель - переменная, которая содержит адрес другой переменной
переменная – переменная, адрес которой хранится в указателе

Слайд 3

Исходные предпосылки

Физическая память компьютера – одномерный массив
Необходимость гибкой работы с адресами оперативной

Исходные предпосылки Физическая память компьютера – одномерный массив Необходимость гибкой работы с
памяти
Си находится между Паскалем и Ассемблером
Широкое применение Си для специализированных ЭВМ с ограниченными ресурсами
Необходимость управления памятью – резервирование и освобождение в процессе работы программы

Слайд 4

Формат описания указателя

тип *имя;
* в описании – признак указателя
тип относится к указуемой

Формат описания указателя тип *имя; * в описании – признак указателя тип
переменной
Примеры
int *p;
float *q;
char *s;

Слайд 5

Свойства указателей

освобождают от необходимости помнить адреса ячеек памяти
поддерживают операции адресной арифметики
перемещение от

Свойства указателей освобождают от необходимости помнить адреса ячеек памяти поддерживают операции адресной
одной ячейки памяти к другой
сравнение указателей

Слайд 6

Инициализация указателей

int A[5]={2,1,5,3,4};
int *p=&A[0];//или int *p=A;

Инициализация указателей int A[5]={2,1,5,3,4}; int *p=&A[0];//или int *p=A;

Слайд 7

Обращение к содержимому

a=*p
* в выражении означает доступ к указуемому содержимому

Обращение к содержимому a=*p * в выражении означает доступ к указуемому содержимому

Слайд 8

Этапы работы с указателем

Определение указателя
Присваивание указателю адреса другой переменной
Работа с переменной через

Этапы работы с указателем Определение указателя Присваивание указателю адреса другой переменной Работа
указатель
int a=5, *p,b=0;
p=&a;//обязательно присвоить адрес!!!
b=*p;
!!! Использование указателя со случайным адресом ведет к непредсказуемым результатам

Слайд 9

Пустой указатель

int *t=NULL;
Пустой указатель – нулевой адрес
При обращении к нему формируется системное

Пустой указатель int *t=NULL; Пустой указатель – нулевой адрес При обращении к
сообщение об ошибке

Слайд 10

Работа с массивами с помощью указателей

int X[]={5,1,4,2,3}, *p, i=2, k=0;
p=&X[0];
p++;
k=*(p+i);

Работа с массивами с помощью указателей int X[]={5,1,4,2,3}, *p, i=2, k=0; p=&X[0]; p++; k=*(p+i);

Слайд 11

Операции адресной арифметики

Обращение к содержимому со смещением
*(p+i) – содержимое ячейки на i

Операции адресной арифметики Обращение к содержимому со смещением *(p+i) – содержимое ячейки
элементов вперед
*(p-i) – содержимое ячейки на i элементов назад
смещение должно быть целым
размер содержимого учитывается автоматически
указатель не изменяется
«Перемещение» вдоль памяти
p++ - на 1 элемент вперед
p-- - на 1 элемент назад
p+i – на i элементов вперед
p-i – на i элементов назад
указатель изменяется

Слайд 12

Операции адресной арифметики

Cравнение указателей
p

Операции адресной арифметики Cравнение указателей p p==q; указатели указывают на одну и
адрес в указателе q?
p==q; указатели указывают на одну и ту же ячейку?
Вычитание указателей
k=p-q;
результат – целое число, показывающее, на сколько элементов адрес в указателе p дальше от начала памяти относительно адреса в указателе q

Слайд 13

Примеры операций над указателями

int X[]={5,1,4,2,3}, *p,*q, i=0, k=0,j=0;
p=&X[2];
q=&X[4];
p--;
k=*(p-1);//k=?
if(p j=q-p;//j=?
if(*p>*q)
i=(*p)-(*q);//i=?

Примеры операций над указателями int X[]={5,1,4,2,3}, *p,*q, i=0, k=0,j=0; p=&X[2]; q=&X[4]; p--;

Слайд 14

Сравнение массивов и указателей

Сходства
Обеспечивают доступ к элементам по номеру
Тип данных учитывает размер

Сравнение массивов и указателей Сходства Обеспечивают доступ к элементам по номеру Тип
элементов
Различия
Адрес массива изменить нельзя- массив привязан к конкретной области памяти
Адрес, записанный в указателе, можно изменить с помощью операций адресной арифметики

Слайд 15

Эквивалентность операций над указателями и массивами

int X[5],*p,k=2;
p=X;
X ~ &X[0]
X+k ~ &X[0]
p+k ~

Эквивалентность операций над указателями и массивами int X[5],*p,k=2; p=X; X ~ &X[0]
&p[k]
*(p+k) ~ p[k]
Работу с указателями можно сделать почти неотличимой от работы с массивами

Слайд 16

Обработка массива с помощью указателя

int X[]={5,1,4,2,3}, *p,*q, i=0, n=5,s=0;
//Способ 1
p=X;
for(i=0;i s=s+p[i];// указатель

Обработка массива с помощью указателя int X[]={5,1,4,2,3}, *p,*q, i=0, n=5,s=0; //Способ 1
на месте, индекс двигается
//Способ 2
for(p=X;p s=s+(*p);// указатель двигается

Слайд 17

Поиск элемента с помощью указателей

int X[]={5,1,4,2,3}, *p,*q, i=0, n=5,s=0;
for(p=X;p if(*p==4)
q=p;
s=*q;
q=X;
for(p=X+1;p

Поиск элемента с помощью указателей int X[]={5,1,4,2,3}, *p,*q, i=0, n=5,s=0; for(p=X;p if(*p==4)
делает фрагмент?
if(*p<*q)
q=p;
s=*q;

Слайд 18

Перестановки элементов с помощью указателей

int X[]={5,1,4,2,3}, *p,*q, i=0, n=5,s=0;
p=X;
q=p+4;
s=*p;
*p=*q;
*q=s;
for(q=p;q printf(“%d”,*q);

Перестановки элементов с помощью указателей int X[]={5,1,4,2,3}, *p,*q, i=0, n=5,s=0; p=X; q=p+4;
Имя файла: Указатели.-Общие-сведениях-об-указателях.pptx
Количество просмотров: 39
Количество скачиваний: 0