Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lexzii_08 / lexs_3_Mas.doc
Скачиваний:
20
Добавлен:
17.05.2015
Размер:
120.32 Кб
Скачать

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

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

Женя

Ваня

Петя

Міша

Гріша

рядок – 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, але це не завжди і компілятор отримує цей символ по різному.

Соседние файлы в папке lexzii_08