Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичні вказівки до лаб. робіт по С++.doc
Скачиваний:
5
Добавлен:
01.05.2025
Размер:
5 Мб
Скачать
☆

4. Техніка показників

Лабораторна робота № 16. Показники

Мета:

Здобути навики використання середовища розробки мови C++, познайомитися з технікою показників, придбати навички застосування показників при створені програм на мові С++.

Короткі теоретичні відомості до роботи.

Показник – це змінна цілого числа, яка містить адресу(номер комірки пам’яті) іншої змінної. Як усяка змінна, показник повинний бути оголошений (об’ялений).

Наприклад :

float a, * aP;

int *iP, I;

char c, *cP;

Оголошені змінні a, I, c різних типів float, int, char і показники aP, iP, cP. Знак * вказує, що це об’явлений показник, і відносяться тільки до наступного ідентифікатору. У принципі ідентифікатор показника може бути будь-яким, але запропонований варіант нагадує програмісту, що ця змінна – показник (pointer).

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

float a = 6, * aP; aP = &a;

int *iP, i = 2; iP = &i;

char c = ‘$’, *cP; cP = &c;

Знак & перед змінною повертає її адресу. Для того, щоб отримати значення змінної, виконується операція разименування. Знак * перед показником повертає значення змінної, на котру показник посилається.

float a1; a1 = * aP;

int i1; i1 = *iP;

char c1; c1 = *cP;

У результаті маємо:

a1 = 6.; i1 = 2; c1 = ‘$’;

Ім’я змінної прямо відсилається до її значення, а показник – непрямо. Посилання на значення за допомогою показника називається непрямою (косвенною) адресацією. Операція адресації і разименування взаємно компенсують один одного при їх застосуванні до показника послідовно у будь-якому порядку:

&*aP еквівалентно *&P

До показника застосовується операція cout<<.

Звертає на себе увагу те, що об’ява показника співпадає з формулою разименування, тому її можна рахувати в деякому роді другим , але непрямою об’явою змінної.

Розглянемо програму, де значення показників виводяться у 16-річній системі числення.

//файл PART3\3_01.ccp – зв'язок змінних і показників

#include “c:\CPP\SUBPROG\\roll.h”

#include “c:\CPP\SUBPROG\\roll_txt.h”

#include <iomanip.h>

main() { clrscr();

float a = 16.07, *aP, a1; //об’ява змінних

int i = 2; *iP, i1; //і показників

aP = &a; iP = &I; //адресація

a1 = *aP; i1 = *iP; // разименування

cout<<”\n значення показник значення ‘

<< “\n змінної змінної\n”

<<setw(11)<<a<<” “<<aP<< setw(13)<<a1

<<”\n”<< setw(11)<<i<<” “<<iP<< setw(13)<<i1;

cout<<”\n\n взаєм. компенс. операцій * і &‘

<<”\n &*aP=”<<&*aP

<<”\n *&aP=”<<*&aP;

cout<<”\n кінець задачі “;

pause (0); return 0;}

РЕЗУЛЬТАТ ВИКОНАНННЯ ПРОГРАМИ

значення показник значення

змінної змінної

16.07 0x427f2bf8 16.07

2 0x427f2bee 2

взаєм. компенс. операцій * і &‘

&*aP= 0x427f2bf8

*&aP= 0x427f2bf8

кінець задачі

Показник може вказувати на дані с атрибутом const і сам мати атрибут const.

Наприклад:

const char *eP; /*об’ява показника на константний символ, хоча показник не є константою*/

const *char eP; /*об’ява константного показника на не константний символ. Значення, що записано у комірку, може змінюватися, але перевести показник на іншу комірку неможливо*/

const char *const eP; /*об’ява константного показника на не константний символ*/

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

Розглянемо два прикладу:

c har *eP; long n; double d; int i;

( long )pPn = &n; d = (double*)&i;

Винятком є показник на тип void, котрому можна присвоювати показники на усі типи.

Наприклад:

void *xP; int i = 4; int *iP; iP = &i;

xP = iP; або xP = &i;

Однак, сам показник на void не може присвоїти показнику на іншій тип без попереднього приведення.

Наприклад:

iP = (int *)xP;

Крім того, показник на void до операції приведення не може бути ні змінений, ні разименований, так як він містить комірку пам’яті для не визначеного типу даних і компілятору не відомо, скільки байтів зарезервовано. Тому:

xP++; //недозволено

i = *xP; //недозволено

(int *)xP++; //дозволено

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

Арифметика показників відрізняється від загальноприйнятою. Коли ціле число n додається до показника (або віднімається з нього), то показник переміщується по коміркам пам’яті на стільки байт, скільки займає n змінних того типу, на якій він вказує. Віднімання двох показників визначає, скільки змінних даного типу розміщується між комірками, що вказані.

Арифметика показників співпадає зі звичайною тільки для показників на символьні змінні, тому що така змінна займає один байт пам’яті.

До показників можна застосовувати також операції порівняння. Арифметика показників має сенс тільки стосовно до масивів, тому що в цьому випадку комп’ютер гарантовано записує змінні одного типу в комірки послідовно один за одним.

Оглядові запитання

  1. Що таке показник і що він містить у собі?

  2. Як об’явити показник?

  3. Як здійснюється операція адресація для показника?

  4. Для чого застосовується для показника операція разименування?

  5. Яким чином ім’я відсилається до значення змінної та показника?

  6. Чи може показник вказувати на дані з атрибутом const?

  7. Може показник мати атрибут const?

  8. Коли показнику можна присвоїти інший показник?

  9. Чим відрізняється арифметика показників від звичайної арифметики?

Лабораторна робота № 17. Показники та масиви

Мета:

Здобути навики використання середовища розробки мови C++, познайомитися з показниками та з масивами, здобути навички написання програм.

Короткі теоретичні відомості до роботи.

Показником на масив є саме ім’я масиву, а також вказівка на його перший елемент. Наприклад:

float array[10], *mP;

mP = array; або mP = &array[0];

Зміна значення показника переводить його на інший елемент масиву.

mP++; //переводить показник на наступний елемент масиву array[1]

mP+=5; //переводить показник на елемент масиву array[6]

--mP; //переводить показник на елемент масиву array[5]

Показник – ім’я масиву має по визначенню атрибут const і не в вимозі змінити його. Така запис, наприклад, не вірна: array++;

Різниці показників,наприклад, int k=mP - array; визначає різницю між номерами елементів, на котрі вказують mP (№6) і array (№1), тобто k=5.

Розглянемо приклад операції присвоєння і порівняння показників:

float *nP; nP=mP;

if (nP==mP) cout<<”показники співпадають”;

Показники на один й тот же тип можуть бути зібрани у масив:

float *mmP[10];

Розглянемо у наступній програмі дії з показниками.

//файл PART3\3_02.ccp – показники та масиви

#include “c:\cpp\subprog\\roll.h”

#include “c:\cpp\subprog\\roll_txt.h”

#include <iomanip.h>

#define N 10

main() { clrscr(); float array[N], *mP, mmP[N];

for (i=0; i<N; i++) {

array[i]= PI *i*i+1; //присвоєння значень вхідному масиву

mmP[i]=&array[i]; /*і масиву показників */ };

mP=&array[0]; //або mP=array; - адресація

cout<<”\nадрес масиву array: “;

cout <<”\narray=”<< array<<”\narray[0]=”<< &array[0]

<<”\nmP= ”<<mP; /*три варіанти визначення

адреси масиву, тобто адреси першого елемента */

if (array= =&array[0]) //порівняння показників

cout <<”\n показник на перший елемент еквівалентний імені масиву”;

k=&array[5] – array;

cout <<”\n\n різниця показників\n&array[5] – array=”<<end1;

cout <<”\n ВИВІД ЕЛЕМЕНТІВ МАСИВУ array”;

for (i=0; i<N; i++)

cout <<”\n”<<i // індекс елемента масиву

<<setw (11)<< array[i] //по значенню

<<setw (11)<< *mP++ /* по показнику на масив з послідовним змішенням

на значення індексу */

<<setw (11)<< *mmP[i]; /*по показнику на кожній елемент */

cout <<”\n\n порівняння показників”;

float *nP; nP= array;

cout<<”\narray=” << setw (13)<< array<<”\n nP=”<<setw(13)<<nP;

pause(0); return 0; }

РЕЗУЛЬТАТ ВИКОНАНННЯ ПРОГРАМИ

адрес масиву array:

array= 0x33b72ba8

array[0]= 0x33b72ba8

mP= 0x33b72ba8

показник на перший елемент еквівалентний імені масиву

різниця показників

&array[5] – array=5

ВИВІД ЕЛЕМЕНТІВ МАСИВУ array

0 1 1 1 1

1 4.14159 4.14159 4.14159 4.14159

2 13.5664 13.5664 13.5664 13.5664

3 29.2743 29.2743 29.2743 29.2743

4 51.2655 51.2655 51.2655 51.2655

5 79.5398 79.5398 79.5398 79.5398

6 114.097 114.097 114.097 114.097

7 154.938 154.938 154.938 154.938

8 202.062 202.062 202.062 202.062

9 255.469 255.469 255.469 255.469

порівняння показників

array=0x33b72ba8

nP = 0x33b72ba8

Оглядові запитання

  1. Що вказує показник на масив?

  2. Що здійснюється при зміні значення показника?

  3. Що визначає показник?

  4. Як визначається різниця між номерами елементів, на котрі вказує показник?

  5. Як виконуються операції присвоєння показників?

  6. Як виконуються операції порівняння показників?

  7. Які властивості повинні мати показники, щоб їх зібрали у масив?

  8. Які ви знаєте три варіанти визначення адреси масиву?

Лабораторна робота № 18. Показники та функції

Мета:

Здобути навики використання середовища розробки мови C++, познайомитися з показниками та з функціями, здобути навички написання програм.

Короткі теоретичні відомості до роботи.

У лабораторних роботах розглядалися два варіанти передачі аргументів у функцію:

  • по значенню, коли створюється копія змінної-аргумента і дія у тілі функції здійснюється з копією, котра після виходу із функції знищується, а власно змінна остається незміною;

  • по посиланню з аргументами-посиланнями, коли при виконанні функції дія виконується з власною змінною-аргументом, котрій після виходу із функції зберігає змінено значення (див., наприклад, swap).

Звернення до функцій в обох випадках однотипні, але побудова прототипів і алгоритмів відрізняється.

Передачу аргументу у функцію можна здійснити також за допомогою аргументу-показника. Порівняємо обидві варіанти функції swap (табл. 1.4)

Таблиця 1.4. Обмін значеннями

Варіант 1

Варіант 2

void swap(int &, int &)

void swap(int &x, int &y)

{ int t;

t=x;

x=y;

y=t; }

//виклик функції swap(x, y);

void swap(int *, int *)

void swap(int *x, int *y)

{ int t;

t=x;

x=y;

y=t; }

//виклик функції swap(&x, &y);

У варіанті 1 розглядається вже знайомі функції, а у варіанті 2 – з використанням показників. Результат використання обох варіантів однаковий. Показник і посилання – споріднені елементи мови С++.

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

Масив може бути аргументом функції. Передача масиву у функцію здійснюється за допомогою показника на масив. Наприклад: