ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 22.12.2021

Просмотров: 734

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

}

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

Якщо ind[i] = 1, то і-й рядок вже розглядався і на черговому кроці рішення задачі її потрібно пропустити. На першому кроці значенням q є індекс рядка з найбільшим кодом першої літери ( на рис. це символ 9). На другому кроці рядок з символом 9 видаляється, і значенням q стає індекс рядка із черговим по величині кодом першої літери (на рис. символ 8) і т. д.

Результати роботи програми такі:

  • ввести память рядків символів

Женя

Ваня

Петя

Міша

Гріша

рядок – 0; адреса рядка – FF70

рядок – 1; адреса рядка – FF84

рядок – 2; адреса рядка – FF98

рядок – 3; адреса рядка – FFAC

рядок – 4; адреса рядка – FFCO

Впорядковані рядки

рядок 0 Петя

рядок 1 Міша

рядок 2 Женя

рядок 3 Гріша

рядок 4 Ваня

Тип покажчик являється основним в будь-якій мові програмування.

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

Додаток до попереднього:

Взаємозв’язок між масивами і покажчиками

Розглянемо взаємозв’язок між масивами і покажчиками. Як згадувалось раніше, адреса конкретної комірки обраховується компілятором, виходячи з адреси першої ячейки, тобто початку масиву, і індексів і розміру базового типу, що дуже схоже на арифметику покажчиків. Насправді, масиви і покажчики – це практично одне і те ж.

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

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

Нехай, є масив

int arr[4]={1,2,3,4};

I покажчик int *p;

Тоді покажчику можна присвоїти адрес масиву

або так: p=&arr[0];

або так: p=arr;

Після цього можна вивести на екран значення третьої ячейки масиву, її індекс дорівнює 2, або так printf(“%i”, arr[2]);

або так printf(“%i”, *(p+2));

або навіть так printf(“%i”, р[2]);

Приклад програми, яка перевіряє сказане:

#include <conio.h>

# include <stdio.h>

void main()

{ clrscr();

int arr[4]={1,2,3,4};

int *p;

p=arr;

printf(“%i%i%i/n”, arr[2], *(p+2), p[2]);

getch();

}

На екрані ми бачимо три трійки, що свідчить про правильність вище перерахованих тверджень.



Приклад

Є опис char a[6] i extern char*a. Чому це не працює ?

Тому що декларація extern char*a не співпадає з поточним оголошенням.

Тип “покажчик на тип Т” не дорівнює типу “масив типу Т”

Використовуйте

extern char s[],

Часто думають, що char s[] еквівалентно char *d. Ні, це відноситься тільки до форм, параметрів, функцій. Масиви – не покажчики. Оголошення масиву char а[6] вимагає певного місця для шести символів, яке буде відоме під іменемd’. Тобто існує місце під іменем ‘d’, в яку будуть поміщені 6 символів. З іншої сторони, оголошення покажчика char *pвимагає місце тільки для самого покажчика. Покажчик буде відомий під іменем “р” і може вказувати на будь-який символ (або неперервний масив символів).

Краще один раз побачити, ніж 100 раз почути:

Оголошення

char s[]=”hello”;

char *p=”world”;

створить структури данних, які можуть бути представлені так:

d:

H

E

L

L

O

/n

P



Важливо розуміти, що посилання типу х[3] породжує різний код в залежності від того х масив чи покажчик.

Якщо взяти написане вище, то коли компілятор зустрічає вираз d[3], він генерує код, який дозволяє здвинутись до місця з іменем “d, зміщується на три символи вперед, а потім читає необхідний символ.

У випадку виразу р[3] компілятор генерує код, щоб почати його з позиції “р”, зчитує значення покажчика, додає до покажчика 3З і, тільки тепер, читає символ, на який вказує покажчик.

В прикладі а[3]=p[3]=l, але це не завжди і компілятор отримує цей символ по різному.


Питання для самоконтролю.

  1. Дати визначення терміну “масив”.

  2. Які характерні особливості має оголошення масиву в мові Сі.

  3. Якими засобами можливо ініціювати масив?

  4. Як визначити розмір масиву за допомогою команди препроцесора?

  5. Що таке покажчик, для чого він використовується в масивах?

  6. Якого типу масиви є в мові Сі?

  7. Як оголосити одновимірний масив використовуючи покажчики?

  8. Як визначити необхідний розмір памяті для розміщення масиву?

  9. Як оголошуються багатовимірні масиви в мові Сі?

  10. Що являє собою трьохвимірний масив?

  11. В якому діапазоні змінюються індекси для десятиелементного масиву?

  12. Чим відрізняються звернення до елементів масиву в мові Сі від відомого раніше.

  13. Що може використовуватися в якості індексу при оголошенні масиву? При роботі з ним в середині програми.

  14. Які є обмеження на кількість вимірювань масиву?

  15. Чим може бути корисним рахівник циклу при сумісній роботі з масивом?

  16. Що таке покажчик, що зберігається в покажчику?

  17. Що таке операція взяття адреси?

  18. Що таке константний покажчик? Приклад.

  19. Які арифметичні дії можна проводити над покажчиками? Для чого вони використовуються?

10