рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Операції з покажчиками

Операції з покажчиками - раздел Образование, Навчальної дисципліни Основи програмування та алгоритмічні мови З Покажчиками Можна Виконувати Наступні Операції: Разадресация, Або Непряме З...

З покажчиками можна виконувати наступні операції: разадресация, або непряме звернення до об'єкту (*), привласнення, складання з константою, віднімання, інкремент (++), декремент (--), порівняння, приведення типів. При роботі з покажчиками часто використовується операція отримання адреси (&).

Операція разадресації,або разименування, призначена для доступу до величини, адреса якої зберігається в покажчику. Цю операцію можна використовувати як для отримання, так і для зміни значення величини (якщо вона не оголошена як константа):

 

char а; // змінна типу char

char * р = new char; /* виділення пам'яті під покажчик і під динамічну змінну типу char */

*р = 'А'; а = *р; // привласнення значення обом змінним

Як видно з прикладу, конструкцію *имя_указателя можна використовувати в лівій частині оператора привласнення, оскільки вона є L-значенням, тобто визначає адресу області пам'яті. Для простоти цю конструкцію можна вважати ім'ям змінної, на яку посилається покажчик. З нею допустимі всі дії, визначені для величин відповідного типа (якщо покажчик ініціалізував). На одну і ту ж область пам'яті може посилатися декілька покажчиків різного типа. Застосована ним операція разадресациі дасть різні результати. Наприклад, програма

 

#include <stdio.h>

int main()

{

unsigned long int A = 0Xcc77ffaa;

unsigned short int* pint = (unsigned short int*) &A;

unsigned char* pchar = (unsigned char *) &A;

printf(" | %x | Xx | Xx |", A *pint, *pchar);

return 0;

}

 

виведе на екран рядок:

| cc77ffaa | ffaa | аа |

Значення покажчиків pint і pchar однакові, але разадресація pcharдає в результаті один молодший байт за цією адресою, а pint - два молодші байти. У приведеному вище прикладі при ініціалізації покажчиків були використані операції приведення типів. Синтаксис операції явного приведення типу простий: перед ім'ям змінної в дужках указується тип, до якого її потрібно перетворити. При цьому не гарантується збереження інформації, тому в загальному випадку явних перетворень типу слід уникати.

При змішуванні у виразі покажчиків різних типів явне перетворення типів потрібне для всіх покажчиків, окрім void*. Покажчик може неявно перетворюватися в значення типу bool (наприклад, у виразі умовного оператора), при цьому ненульовий покажчик перетвориться в true, а нульовий в false. Привласнення без явного приведення типів допускається в двох випадках:

покажчикам типу void*;

якщо тип покажчиків справа і зліва від операції привласнення один і той же.

Таким чином, неявне перетворення виконується тільки до типу void*. Значення 0 неявно перетвориться до покажчика на будь-який тип. Привласнення покажчиків на об'єкти покажчикам на функції (і навпаки) неприпустимо. Заборонено іпривласнювати значення покажчикам-константам, втім, як і константам будь-якого типа (привласнювати значення покажчикам на константу і змінним, на які посилається покажчик-константа, дозволяється).

Арифметичні операціїз покажчиками (складання з константою, віднімання, інкремент і декремент) автоматично враховують розмір типу величин, що адресуються покажчиками. Ці операції застосовні тільки до покажчиків одного типа і мають сенс в основному при роботі із структурами даних, послідовно розміщеними в пам'яті, наприклад, з масивами.

Інкремент переміщає покажчик до наступного елементу масиву, декремент - до попереднього. Фактично значення покажчика змінюється на величину sizeof(тип). Якщо покажчик на певний тип збільшується або зменшується на константу, його значення змінюється на величину цієї константи, помножену на розмір об'єкту даного типа, наприклад:

 

short * р = new short [5]:

р++; // значення р збільшується на 2

long * q = new long [5];

q++; // значення q збільшується на 4

 

Різниця двох покажчиків - це різниця їх значень, що ділиться на розмір типу в байтах (у застосуванні до масивів різниця покажчиків, наприклад, на третій і шостий елементи рівна 3). Підсумовування двох покажчиків не допускається.

При записі виразів з покажчиками слід звертати увагу на пріоритети операцій. Як приклад розглянемо послідовність дій, задану в операторі

 

*р++ = 10;

 

Операції разадресації і інкремента мають однаковий пріоритет і виконуються справа наліво, але, оскільки інкремент постфіксний, він виконується після виконання операції привласнення. Таким чином, спочатку за адресою, записаною в покажчику р, буде записане значення 10, а потім покажчик буде збільшений на кількість байт, відповідне його типу. Те ж саме можна записати докладніше:

 

*р = 10; р++;

 

Вираз (*р)++, навпаки, інкрементіруєт значення, на яке посилається покажчик.

Унарна операція отримання адреси & застосовна до величин, що мають ім'я і розміщеним в оперативній пам'яті. Таким чином, не можна одержати адресу скалярного виразу, неіменованої константи або регістрової змінної. Приклади операції наводилися вище.

Ідентифікатор масиву є константним покажчиком на його нульовий елемент. Наприклад, для масиву з попереднього лістингу ім'я b - це те ж саме, що &b[0], а до i-му елементу масиву можна звернутися, використовуючи вираз *(b+i). Можна описати покажчик, привласнити йому адресу почала масиву і працювати з масивом через покажчик. Наступний фрагмент програми копіює всі елементи масиву а в масив b:

 

Int a[100], b[100];

int *pa = а;

int *pb = b:

for (int i = 0; i<100; i++)

*pb++ = *pa++; // або pb[i]= pa[i];

 

Динамічні масивистворюють за допомогою операції new, при цьому необхідно вказати тип і розмірність, наприклад:

 

int n = 100;

float *р = new float [n];

 

У цьому рядку створюється змінна-покажчик на float, в динамічній пам'яті відводиться безперервна область, достатня для розміщення 100 елементів речовинного типа, і адреса її початку записується в покажчик р. Динамічні масиви не можна при створенні ініціалізувати, і вони не обнуляються.

Перевага динамічних масивів полягає в тому, що розмірність може бути змінною, тобто об'єм пам'яті, що виділяється під масив, визначається на етапі виконання програми. Доступ до елементів динамічного масиву здійснюється точно так, як і до статичних, наприклад, до елементу номер 5 приведеного вище масиву можна звернутися як р[5] або *(р+5).

Альтернативний спосіб створення динамічного масиву - використання функції malloc бібліотеки C:

 

int n = 100:

float *q = (float *) malloc(n * sizeof(float));

 

Операція перетворення типу, записана перед зверненням до функції malloc, потрібна тому, що функція повертає значення покажчика типу void*, а ініціалізувався покажчик на float.

Пам'ять, зарезервована під динамічний масив за допомогою new [], повинна звільнятися операцією delete []. а пам'ять, виділена функцією mallос - за допомогою функції free, наприклад:

 

delete [] p; free (q);

 

При невідповідності способів виділення ізвільнення пам'яті результат не визначений. Розмірність масиву в операції delete не указується, але квадратні дужки обов'язкові.

Багатовимірні масивизадаються вказівкою кожного вимірювання в квадратних дужках, наприклад, оператор

 

int matr [5][6];

 

задає опис двовимірного масиву з 5 рядків і 6 стовпців. У пам'яті такий масив розташовується в послідовних осередках відрядковий. Багатовимірні масиви розміщуються так, що при переході до наступного елементу найшвидше змінюється останній індекс. Для доступу до елементу багатовимірного масиву указуються всі його індекси, наприклад, matr[i][j], або більш екзотичним способом: *(matr[i]+j) або *(*(matr+i )+j). Це можливо, оскільки matr[i] є адресою почала i-й рядки масиву.

Для створення динамічного багатовимірного масиву необхідно вказати в операції new все його розмірності (найлівіша розмірність може бути змінною) наприклад:

 

int nstr = 5;

int ** m = (int **) new int [nstr][10];

 

Більш універсальний і безпечний спосіб виділення пам'яті під двовимірний масив, коли обидві його розмірності задаються на етапі виконання програми приведений нижче:

 

int nstr, nstb;

cout << " Введіть кількість рядків і стовпців :";
cin >> nstr , nstb;
int **a = new int *[nstr]; // 1
for(int i = 0; i<nstr; i++) // 2
а[i] = new int [nstb]; // 3

 

У операторі 1 оголошується змінна типу покажчик на покажчик на int і виделяєтся пам'ять під масив покажчиків на рядки масиву (кількість рядків nstr). У операторі 2 організовується цикл для виділення пам'яті під кожною строь масиву. У операторі 3 кожному елементу масиву покажчиків на рядки привласнюється адреса почала ділянки пам'яті, виділеного під рядок двовимірного масиву. Кожен рядок складається з nstb елементів типу int.

Звільнення пам'яті з-під масиву з будь-якою кількістю вимірювань виконується за допомогою операції delete []. Покажчик на константу видалити не можна.

 

– Конец работы –

Эта тема принадлежит разделу:

Навчальної дисципліни Основи програмування та алгоритмічні мови

ХАРКІВСЬКИЙ НАЦІОНАЛЬНИЙ ЕКОНОМІЧНИЙ УНІВЕРСИТЕТ... Методичні рекомендації до лабораторних робіт з навчальної дисципліни...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Операції з покажчиками

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

ЗАГАЛЬНІ ПОЛОЖЕННЯ
Методичні рекомендації призначені для виконання лабораторних робіт з першої частини навчальної дисципліни «Основи програмування та алгоритмічні мови». Перед виконанням кожної роботи необхі

Покажчики
Коли компілятор обробляє оператора визначення змінної, наприклад, int i =10, він виділяє пам'ять відповідно до типу (int) і ініціалізував її вка-заним значенням (10). Всі звернення в програмі до зм

Ініціалізація покажчиків
Покажчики найчастіше використовують при роботі з динамічною пам'яттю, званою деякими естетами купою (переклад з англійської мови слова heap). Це вільна пам'ять, в якій можна під час виконання прогр

Рядки символів як масиви
Рядок має тип “масив з символів”. Рядок завершується нульовим символом. Наприклад, рядок QWERTY має тип char [7], порожній рядок “ має тип char[1]. Рядкова константа - це послідовні

Рядкові бібліотечні функції
Функції для роботи з рядками описані в заголовному файлі string.h. Деякі з них: char *stpcpy(char *dest, const char *src); Копіює символи рядка, поки не скопіює нульовий символ. П

Відкриття і закриття потоку
Схема роботи з потоком така ж, як і з файлом: відкрити потік, виконати читання і/або запис, закрити потік. Відкриває потік функція FILE* fopen( const char *filename,// ім

Введення і виведення рядків
Читання рядка з потоку виконується функцією char *fgets( char *s, // покажчик на буфер, що приймає рядок int n, // гранична кількість читаних символів (звичайно розмір бу

Форматоване виведення
Розглянуті вище функції виводять інформацію в потік без або майже без перетворення. Функція fprintf перетворить дані, що виводяться, в послідовність символів, керуючись рядком формату. int

Форматоване введення
Для форматованого введення з потоку застосовують функцію int fscanf (FILE *stream, const char *format [, address, ...] ) - повертає число полів введення тих, що

Варіант 20
Написати програму, яка: · Виводить текст на екран дисплея; · Визначає найбільшу кількість підряд пропусків, що йдуть, в тексті; · По натисненню довільної клавіші по черзі

Стадії і команди препроцесорної обробки
У інтегроване середовище підготовки програм на С++ в компілятор мови як обов'язковий компонент входить препроцесор. Призначення препроцесора - обробка початкового тексту програми до її компіляції.

Включення текстів з файлів
Для включення тексту з файлу використовується команда #include, що має дві форми запису: #include <имя_файла> // Ім'я в кутових дужках #include "имя_файла" // Ім'я

Умовна компіляція
Умовна компіляція забезпечується в мові С++ набором команд, які, по суті, управляють не компіляцією, а препроцесорною обробкою: #if константний вираз #ifdef ідентифікатор

Макропідстановки засобами препроцесора
Макрос, за визначенням, є засіб заміни однієї послідовності символів іншої. Для виконання замін повинні бути задані відповідні макроозначення. Просте макроозначення ми вже ввели, розглядаючи директ

Теоретичний матеріал
  Структури - це складені типи даних, побудовані з використанням інших типів. Вони є об'єднаний загальним ім'ям набір даних різних типів. Саме тим, що в ст

Масиви структур.
Методика створення масивів структур - така сама, як і при створенні масивів. Наприклад, що б створити масив з 100 екземплярів BestStudent структури Student, необхідний наступний запис: Stu

Варіант 3
Відомість використання машинного часу на обчислювальному центрі: № з/п Кафедра Використання машиного часу (год) Відхилення

Варіант 4
Відомість споживання електроенергії на заводах міста: № з/п Завод Потреба електроенергії, кВт/ч Відхилення від плана

Варіант 5
Відомість руху матеріалів на складах підприємства за звітний період: № п/п Склад Рух материалів за період, грн остаток на к

Варіант 8
Відомість відвідин занять студентами: № з/п Прізвище Пропущено годин Відхилення від плану за планом

Варіант 10
Відомість обліку часу роботи верстатів підприємства: № з/п Тип станка Час роботы (год) Відхилення від плану

Варіант 11
Відомість випуску деталей робітниками цеху: № з/п Прізвище Кількість деталей (шт.) Брак виготовлено

Варіант 13
Відомість нарахування зарплати співробітникам підприємства: № з/п Прізвище Нараховано (грн) Виплати

Варіант 17
Відомість оплати ремонту обладнання підприємства за звітний період: № зп Обладнання Вид ремонту Вартість комплектуючих

Варіант 20
Відомість телефонних переговорів абонента за звітний період: № зп Абонент № телефона Тривалість переговорів (хв.)

Короткі теоретичні відомості
  STL - це бібліотека стандартних шаблонів. Вона містить, наприклад, що часто зустрічаються способи організації даних - так називані контейнери: динамічні масиви, двонаправленi списки

Варіант 20
Скласти програму, яка містить поточну інформацію про заявки на туристичні тури. Кожна заявка включає: · пункт призначення; · номер туру; · прізвище і ініціали за

Дослідження структури windows-додатка
  Ціль лабораторної роботи - одержання практичних навичок у побудові базового додатка для Win32, дослідження параметрів віконних процедур. Перед виконанням лабораторної робот

Перелік бітових прапорів стилю класу вікна
Прапор Опис CS _VREDRAW Перемалювати вікно при зміні висоти вікна CS_HREDRAW Перемал

Список визначених системних піктограм
Іконка Опис IDI_APPLICATION Піктограма додатка, задана за замовчуванням IDI_ASTERISK

Список визначених ідентифікаторів курсору
Курсор Опис IDC_APPSTARTING Стандартна стрілка й пісковий годинник. IDC_ARROW Станда

Перелік бітових прапорів стилю вікна
Прапор Опис WS_BORDER У вікна є тонка обмежуюча рамка WS_CAPTION WS_BORDER | WS_DLGF

Варіант № 20
Вікно повинне: · бути згорнутим; · мати власний контекст; · завантажувати іконку у вигляді молодого півмісяця; · мати курсор у вигляді двухконечной стрілки з нап

Дослідження взаємодії додатка з користувачем
  Ціль лабораторної роботи: Досліджувати можливості функцій Win32 API по створенню візуального інтерфейсу додатка, одержати практичні навички написання й настроювання програм, які міс

Значки, покажчики миші й крапкові малюнки
Ресурси даного типу створюються за допомогою різних редакторів, але тому що всі вони ставляться до растрових зображень, робиться це по одному принципі. Редактори значків і покажчиків миші дозволяют

Створення меню
Що таке меню. Меню - це список команд й опцій програми. У ряді випадків пункти меню можуть бути представлені растровими зображеннями. Вибрати елемент меню можна за допомогою миші, клавіатури або пе

Діалогові вікна
Використання меню варто розглядати як найпростіший спосіб уведення інформації користувачем. Більше зробленим методом передачі даних у програму є застосування діалогових вікон. Можливість уведення д

Розробка діалогового вікна
Для діалогового вікна необхідно скористатися відповідним редактором. Редактор діалогових вікон викликається в процесі реалізації ланцюжка дій ( Рис. 7.4).  

Компонування діалогового вікна
За допомогою миші розмістите поле й напис у потрібнім місці й задайте їхній розмір. Щиглик мишею усередині макета діалогового вікна дозволить відредагувати заголовок вікна або текстовий рядок, що н

Бітові прапори, що визначають поводження й вид елемента меню
Прапор Опис MF_BITMAP Замість рядка в якості меню застосовується bitmap MF_BYCOMMAND

Можливі типи рядка стану
Тип Опис SBT_NOBORDERS Панель прорисовується без обмежувальних ліній SBT_POPOUT Пане

Перелік бітових прапорів стилю вікна
Прапор Опис WS_BORDER У вікна є тонка обмежуюча рамка WS_CAPTION WS_BORDER | WS_DLGF

Стилі діалогового вікна
Прапор Ефект DS_ABSALIGN Позиціювати діалогове вікно щодо лівого верхнього кута екрана DS_SYSMODA

Таблиця 7.5
Стилі вікон класу "кнопки" Стиль Опис BS_3STATE Створити прапорець, що має три стани

Варіант № 3
Головне меню містить три групи команд: · Головне меню містить розділ "Фігури" з іменами геометричних фігур: коло, квадрат, трикутник, прямокутник і шестикутник. При виборі назви

Варіант № 11
Головне меню містить три групи команд: · Розділ "Файл" головного меню містить рядка "Створити", "Відкрити", "Демо-версiя" й "Вихід". При в

Варіант № 13
Головне меню містить три групи команд: · Робочу область вікна додатка повністю займає тимчасове вікно з порожнім головним меню. Головне меню вікна додатка із тримає розділ "Файл"

Варіант № 17
Головне меню містить три групи команд: · Головне меню містить розділ "Файл" з рядками "Створити", "Відкрити", "Видалити" й "Вихід". При ви

Варіант № 18
Робочу область вікна додатка, повністю займає тимчасове вікно з порожнім головним меню. Головне меню вікна додатка містить розділ "Файл" з рядками "Відкрити" й "Закрити&quo

Варіант № 20
· Тип елемента керування: Combobox. Мінімальне число пунктів меню - 5, максимальне число пунктів меню - 11. · Перша сторінка блокнота містить назви книг, друга - на звання глав обраної кни

Короткі теоретичні відомості й історичний аспект
  Середовище .NET Framework   .NET Framework — центральна частина Visual C++ 2005, як і всіх інших засобів розробки .NET компанії Microsoft. Середовище .NET Fra

Специфіка C++/CLI: фундаментальні типи даних
Фундаментальні типи ISO/ANSI C++ можна використати у своїх програмах C++/CLI, і з арифметичними операціями вони працюють точно так само, як й у рідному C++. Крім того, в C++/CLI визначені два додат

Фундаментальні типи C++/CLI
Фундаментальний тип Розмір (у байтах) Клас значень CLI bool System: -.Boolean

Створення простого керованого консольного додатка.
Для створення консольного додатка на керованому C++ варто виконати наступну послідовність операцій:   1. Запустите на виконання Visual Studio. NET (2005 або більше нової)

Стандартний ввід-вивід
Клас System::Console забезпечує підтримку стандартного вводу-висновку. Метод ReadLine класу System::Console зчитує уведену із клавіатури рядок як текстову. String^ line = Console::ReadLine

Часто використовувані специфікатори формату
Специфікатор формату Опис C або з Виводить значення в грошовому форматі. dабо d Виво

Часто використовувані специфікатори формату
Специфікатор формату Опис C або з Виводить значення в грошовому форматі. dабо d Виво

Дескриптори, що відслідковують
Дескриптори, що відслідковують, (tracking handle) мають подібність із рідними покажчиками C++, однак є й істотні відмінності. Дескриптор зберігає адреса, і адреса, що у ньому втримується, автоматич

Оголошення дескрипторів, що відслідковують
Для специфікації дескриптора типу, необхідно помістити символ : (часто називаний "капелюхом") слідом за ім'ям типу. Наприклад, от як можна оголосити відслідковує дескриптор, що, по імені

Масиви CLR
Масиви CLR відрізняються від масивів рідного C++. Пам'ять для масиву CLR виділяється в керованій купі, але це ще не все. Масиви CLR мають убудовану функціональність, який немає в масивів рідного C+

Багатомірні масиви
У програмах на C++/CLI можна створювати масиви із двома й більше вимірами; максимальна кількість вимірів масиву - 32, чого цілком достатньо в більшості випадків. Кількість вимірів масиву вказується

Багатомірні масиви
У програмах на C++/CLI можна створювати масиви із двома й більше вимірами; максимальна кількість вимірів масиву - 32, чого цілком достатньо в більшості випадків. Кількість вимірів масиву вказується

Цикл foreach
При обробці масивів і рядків дуже часто, використають оператори циклів. Всі оператори циклів, які застосовуються в мові ISO/ANSI C++, також використаються й у и в C++/CLI. Але мова C++/CLI пропонує

Варіант 20
В одномірному масиві, що складається з п речовинних елементів, обчислити: o добуток позитивних елементів масиву; o суму елементів масиву, розташованих до мінімального елемента.

Навчальне видання
  Методичні рекомендації до лабораторних робіт з навчальної дисципліни «Основи програмування та алгоритмічні мови» Частина 2 для студентів напряму

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги