Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Робота з непрямою адресацієюСодержание книги
Поиск на нашем сайте
Так як показник містить адреси об'єкта, це дає можливість "непрямого" доступу до цьому об'єкту через покажчик. Припустимо, що х - перемінна, наприклад, типу int, а рх - покажчик, створений якимсь ще не зазначеним способом. Унарна операція & видає адресу об'єкта, так що оператор рх = &х; привласнює адреса х перемінної рх; говорять, що рх "указує" на х. Операція & застосовна тільки до перемінного й елементам масиву, конструкції виду &(х-1) і &3 є незаконними. Не можна також одержати адреса реєстрової перемінної. Унарна операція * розглядає свій операнд як адреса кінцевої мети і звертається по цій адресі, щоб витягти вміст. Отже, якщо y теж має тип int, те y = *рх; привласнює y уміст того, на що вказує рх. Так послідовність рх = &х; y = *рх; привласнює y те ж саме значення, що й оператор y = x; перемінні, що беруть участь у всім цьому необхідно описати: int x, y; int *px; с описом для x і y ми вже неодонократно зустрічалися. Опис покажчика int *px; є новим і повинне розглядатися як мнемонічне; воно говорить, що комбінація *px має тип int. Це означає, що якщо px з'являється в контексті *px, те це еквівалентно перемінної типу int. Фактично синтаксис опису перемінної імітує синтаксис виражень, у яких ця перемінна може з'являтися. Це зауваження корисне у всіх випадках, зв'язаних зі складними описами. Наприклад, double atof(), *dp; говорить, що atof() і *dp мають у вираженнях значення типу double. y = *px + 1 привласнює y значення, на 1 більше значення x; printf("%d\n", *px) друкує поточне значення x; d = sqrt((double) *px) одержує в d квадратний корінь з x, причому до передачі функції sqrt значення x перетвориться до типу double. (Дивися главу 2). y = *px + 1 унарні операції * і & зв'язані зі своїм операндом більш міцно, чим арифметичні операції, так що таке вираження бере те значення, на яке вказує px, додає 1 і привласнює результат перемінної y. Ми незабаром повернемося до того, що може означати вираження y = *(px + 1) Посилання на покажчики можуть з'являтися й у лівій частині присвоювань. Якщо px указує на x, то *px = 0 думає x рівним нулеві, а *px += 1 збільшує його на одиницю, як і вираження (*px)++ круглі дужки в останньому прикладі необхідні; якщо них опустити, те оскільки унарні операції, подібні * і ++, виконуються праворуч ліворуч, це вираження збільшить px, а не ту перемінну, на яку він указує. py = px копіює вміст px у py, у результаті чого py указує на те ж, що і px. Оскільки в "C" передача аргументів функціям здійснюється "за значенням", викликана процедура не має безпосередньої можливості змінити перемінну з зухвалої програми. Що ж робити, якщо вам дійсно треба змінити аргумент? Наприклад, програма сортування захотіла б поміняти два елементи, які порушують порядок за допомогою функції з ім'ям swap. Для цього недостатньо написати swap(a, b); визначивши функцію swap при цьому в такий спосіб: swap(x, y) /* wrong */ int x, y; { int temp; temp = x; x = y; y = temp; } через виклик за значенням swap не може впливати на агументи a і b у функції, що викликається. swap(&a, &b); тому що операція & видає адресу перемінної, те &a є покажчиком на a. У самої swap аргументи описуються як покажчики і доступ до фактичних операндам здійснюється через них. swap(px, py) /* interchange *px and *py */ int *px, *py; { int temp;
temp = *px; *px = *py; *py = temp; } Питання для контролю: 1.Що таке покажчик? 2. Як за допомогою покажчика отримати адресу об’єкту? 3.Як отримати об’єкт за допомогою покажчика? Література: 1.Шилдт Г.: Пер. с англ. –М.: Издательский дом “Вильямс”, 2002. –704с. –стор 140-142 Урок №31 (згідно робочої навчальної програми) Тема: Подвійні покажчики як параметри функції Питання: 1.Робота з покажчиками як параметрами функцій Робота з покажчиками як параметрами функцій Покажчики як аргументи звичайно використовуються у функціях, що повинні повертати більш одного значення. (Можна сказати, що swap повертає два значення, нові значення її аргументів). Як приклад розглянемо функцію getint, що здійснює перетворення даних, що надходять у вільному форматі, розділяючи потік символів на цілі значення, по одному цілому за одне звертання. Функція getint повинна повертати або знайдене значення, або ознака кінця файлу, якщо вхідні дані цілком вичерпані. Ці значення повинні повертатися як окремі об'єкти, яке б значення ні використовувалося для EOF, навіть якщо це значення цілого, що вводиться. int n, v, array[size]; for (n = 0; n < size && getint(&v)!= EOF; n++) array[n] = v; У результаті кожного звертання v стає рівним наступному цілому значенню, знайденому у вхідних даних. Зверніть увагу, що як аргумент getint необхідно вказати &v а не v. Використання просте v швидше за все приведе до помилки адресації, оскільки getint думає, що вона працює саме з покажчиком. Сама getint є очевидною модифікацією написаної нами раніше функції atoi: getint(pn) /* get next integer from input */ int *pn; { int c,sign; while ((c = getch()) == ' ' || c == '\n' || c == '\t'); /* skip white space */ sign = 1; if (c == '+' || c == '-') { /* record sign */ sign = (c == '+')? 1: -1; c = getch(); } for (*pn = 0; c >= '0' && c <= '9'; c = getch()) *pn = 10 * *pn + c - '0'; *pn *= sign; if (c!= EOF) ungetch(c); return(c); } Вираз *pn використовується всюди в getint як звичайна змінна типу int. Ми також використовували функції getch і ungetch, так що один зайвий символ, який приходиться зчитувати, може бути поміщений назад у введення. Питання для контролю: 1. В якому випадку покажчики використовуться як аргументи функцій? 2. Що таке аргумент функції? 3.Як здійснється робота з покажчиками, які передаться як параметри функції? Література: 1.Шилдт Г.: Пер. с англ. –М.: Издательский дом “Вильямс”, 2002. –704с. –стор 142-144
Урок №32 (згідно робочої навчальної програми)
Тема: Покажчики як результати роботи функції, покажчики на функції Питання: 1.Використання вказівників 2.Операції з вказівниками Використання вказівників Вказівники - це змінні, що використовуються для збереження адреси. Унарна операція & повертає адресу, по якій зберігається змінна. Якщо х - це змінна, то &х - її адреса. Адресу можна представити у вигляді комірки пам'яті. У персональному комп'ютері адреси представляються у шістнадцятирічному вигляді. Наприклад: printf("%d %p \n", pooh, &pooh); Оголошення вказівників int * pi; char * рс; float *pf, *pq; Операції з вказівниками Існує п'ять основних операцій, що можна виконувати по відношенню до змінних вказівників: 1. присвоювання - вказівнику можна присвоїти адресу, завдяки оператору &; 2. Знаходження значення. Оператор * видає значення, що зберігається у вказаній комірці; 3. отримання адреси вказівника; 4. збільшення вказівника на 1. Збільшення вказівника на значення елементу масиву заставляє його зміститися до наступного елементу масиву. Наприклад, ptr++ збільшує числове значення ptraa чотири (чотири байта для значень типу int) і призводить до того, що він вказує на елемент масиву 5. Віднімання. Можливо обчислювати різницю між двома вказівниками. Звичайно, ця операція використовується для двох вказівників на елементи одного й того самого масиву для виявлення відстані між елементам Питання для контролю: 1. Що таке вказівник? 2. Де можна застосувати вказівники? 3. Які є операції з вказівниками? Література: 1.Шилдт Г.: Пер. с англ. –М.: Издательский дом “Вильямс”, 2002. –704с. –стор 142-144 Урок №35 (згідно робочої навчальної програми) Тема: Використання покажчиків Питання: 1.Використання вказівників в програмі
|
||||
Последнее изменение этой страницы: 2016-08-10; просмотров: 235; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.59.92.247 (0.007 с.) |