Lektsia 2


Чтобы посмотреть презентацию с картинками, оформлением и слайдами, скачайте ее файл и откройте в PowerPoint на своем компьютере.
Текстовое содержимое слайдов презентации:

Назначение указателей.Объявление указателей.Операции над указателями.Указатели и массивы.Указатели и строки.Ссылки.Указатели в параметрах функций. Указатели (pointers) 8 double 8 long float 4 float типы данных с плавающей точкой 4 unsigned long int 4 long int 4 unsigned int 4 int 2 unsigned short int 2 short int  целочисленные типы данных 1 char целочисленный (символьный) тип данных 0   /   255 (0 – false, 1-255 – true) 1 bool целочисленный (логический) тип данных Диапазон принимаемых значений байт Тип Типы данных С++ Оперативная память компьютера может рассматриваться как массив байтов, индексируемый от нуля. Номер каждого байта в этом массиве называется его адресом. Адресом переменной называется адрес ее первого байта места хранения. Переменные, в которых хранятся адреса других переменных, называются указателями. Указатель – переменная, диапазон значений которой состоит из адресов ячеек памяти или специального значения — нулевого адреса. Последнее используется для указания того, что в данный момент указательне ссылается ни на одну из допустимых ячеек. 1. Назначение указателей Обеспечивают гибкость программирования: указатель (рtr) знает лишь адрес переменной (а), сама переменная может менять свое значение независимо от наличия указателя на нее. Справочная служба 109. Адрес – указатель, номер телефона – значение переменной.Результат: при изменении номера нет необходимости оповещать об этом всех абонентов.Расчетный счет.Счет не меняется, а содержимое – сколько угодно.Результат: достаточно помнить номер счета или карты.Файловый указатель. Один и тот же указатель обращается всякий раз к текущему элементу файла, после чего перемещается на следующий. Результат: через один указатель можно работать с различными данными, находящимися в файле Примеры: ptr а Назначение указателей (Тематика) Правильное понимание и использование указателей особенно необходимо для составления хороших программ по следующим причинам:указатели являются средством, при помощи которого функции могут изменять значения передаваемых в нее аргументов;при помощи указателей выполняется динамическое распределение памяти;указатели позволяют повысить эффективность программирования;указатели обеспечивают поддержку динамических структур данных (деревья, связные списки). Однако указатель может вызвать и ряд затруднений:если указатель содержит неправильное значение, программа может быть неработоспособной (access violation). можно легко ошибиться при использовании указателей; ошибки, связанные с неправильными значениями указателей, найти очень трудно. Назначение указателей (Техника) При объявлении переменной для нее резервируется память.При определении – этому участку памяти присваивается значение. Общая форма объявления указателя:тип * имя; int *р; // р – указатель на int int *р, q; // q – не указательint *р, *q; // p и q – указателиP = NULL; // пустой (нулевой) указательvoid* p; // бестиповый указатель Нулевой указатель − это указатель, хранящий специальное значение, используемое для того, чтобы показать, что данная переменная-указатель не ссылается (не указывает) ни на какой объект (в С и С++ - это 0 или макрос NULL - нулевой адрес, зарезервирован ОС). void используется для того, чтобы показать, что указатель означает просто адрес памяти, независимо от типа величины, находящейся по этому адресу Объявление указателей Присваивание указателю значение адреса переменной (& - унарная операция (амперсанд):p=&q; где p – указатель, q – идентификатор переменной,.2. Определение значения, на которое ссылается указатель (* - унарная операция косвенной адресации или разыменования):val=*p; // в результате val=q3. Увеличение (уменьшение) указателя: (+ сложение, ++ инкрементация,  –вычитание, –– декрементация).Пример:Если p1 – указатель, то  р1++  перемещает указатель на 1 байт, если *p1 имеет тип char;4 байта, если *p1 имеет тип int ;4 байта, если *p1 имеет тип float.4. Разность двух указателей. Например, чтобы найти, на каком расстоянии друг от друга находятся элементы массива. Операции над указателями //Даны адреса переменных &a=63384,&b=64390,&c=64404. //Что будет выведено на печать?# include int main(){float a,*p1;int b,*p2;char c,*p3;a=2.5; b=3; c='A';p1=&a; p2=&b; p3=&c;p1++; p2++; p3++;printf("\n p1=%u, p2=%u, p3=%u",p1,p2,p3);return 0;} Ответ: р1=63388, р2=64394, р3=64405. Пример 2.1: Указатели одного типа можно сравнивать на равенство и неравенство.Указатели разных типов несовместимы по присваиванию. void *UndefPoint; UndefPoint = 0xb8000000; // недопустимоUndefPoint++; // Для типа void * нет такой операции… (int *)UndefPoint++; // И так тоже ничего не получается…((int *)UndefPoint)++; // А так хорошо… Сколько скобок! ++(int *)UndefPoint; // И вот так тоже хорошо… Приведение типов указателей Правила присваивания указателей Указатель на массив – это адрес его первого элемента.Элементы массива расположены в памяти последовательно, поэтому увеличение указателя на единицу означает смещение к следующему элементу массива. long array[100]; long sum = 0; for (long* ptr = &array[0]; ptr < &array[99] + 1; ptr++) sum += *ptr;//илиfor (long* ptr = array; ptr < &array[99] + 1; ptr++) sum += *ptr; Смешивать указатели и массивы можно, делать это не рекомендуется! Указатели и массивы Строка в Си - это последовательность байт (букв, символов), завершающаяся в конце специальным признаком - байтом '\0'. Указатель типа char* - это строка. Использование указателей, а не массивов с фиксированными размерами, особенно целесообразно, когда предложения или слова должны быть разной длины. char *point[]={"понедельник","вторник","среда","четверг", "пятница","суббота","воскресенье"};int i,n;n=sizeof(point)/sizeof(point[0]);for(i=0;i < n;i++) {printf("\n %s",point[i]); // 1) printf("\n %p",point[i]); // 2)} понедельник вторник среда четверг пятница суббота воскресенье 1) 2) Указатели и строки Изменить значение фактического параметра возможно с помощью механизма указателей. С помощью указателя в вызываемую функцию можно передать адрес любого объекта из вызывающей программы. Не меняя самого параметра функции (адрес) можно изменить содержимое ячейки по данному адресу 1) 2) void main() { positive(int *m); int k=-3; positive(&k); printf("\n k=%d",k); getch();} void positive(int *m){ if (*m < 0) *m=-*m; } Если в качестве параметра функции используется обозначение массива, то на самом деле внутрь функции передаётся только адрес начала массива, а значит внутри функции можно изменять значения элементов такого массива. Указатели в параметрах функции Ссылка - тот же указатель, т.е. если функции параметр передается как ссылка, то функция работает не с копией параметра, а с самим параметром. Программа выведет '3'. Если в объявлении 'f' убрать & перед a, то программа выведет 4. Плюс ссылок - не надо пользоваться разыменовыванием (оператор *) и взятием адреса (оператор &). Минус - обязательно надо на что-нибудь ссылаться, то есть нельзя передать NULL как ссылку int a; // переменная типа intint &b = a; // ссылка на a void f(int &a) { a = 3; } void main() { int k = 4; f(k); printf("%d\n",k); } Ссылки int A = 10;int &B = A; // B – ссылка на переменную Acout << B << " "; // 10A /= 2;cout << B << " "; // 5B *=5;cout << A << " "; // 25int C = 20;B = C;cout << A << " "; // 20 Ссылка - псевдоним объекта, скрытая форма указателя, который при использовании автоматически разыменовывается. Ссылка должна быть обязательно проинициализирована сразу при объявлении. Любое изменение значения ссылки повлечет за собой изменение того объекта, на который данная ссылка указывает. Пример работы со ссылкой

Приложенные файлы

  • ppt 18814029
    Размер файла: 131 kB Загрузок: 0

Добавить комментарий