На головну

Покажчики та одномірні масиви

  1.  бібліографічні покажчики
  2.  динамічні масиви
  3.  динамічні масиви
  4.  Ідентифікатори, змінні, масиви
  5.  масиви
  6.  масиви
  7.  масиви

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

В СІ існує тісний зв'язок між покажчиками і масивами. Будь-доступ до елементу масиву, здійснюваний операцією індексування, може бути виконаний за допомогою покажчика.

декларація

int a [10];

визначає масив а розміру 10, т. е блок з десяти послідовних об'єктів, представлених на малюнку, з іменами a [0], a [1], ..., a [9].

 
 

 Запис a [i] відсилає нас до i-му елементу масиву. Якщо ра є покажчик, т. Е визначено як

int * pa; , То в результаті привласнення

pa = & a [0];

pa буде вказувати на нульовий елемент масиву а; інакше кажучи, ра буде містити адресу елемента a [0] (див. рис.). тепер присвоювання

x = * pa;

буде копіювати вміст а [0] в х.

Якщо ра вказує на певний елемент масиву, то ра + 1 по визначенню вказує на наступний елемент (див. Рис.). Таким чином, якщо ра вказує на a [0], то * (ра + 1) є вміст a [1], ра + 1 - адреса a [1], * (ра + i) - вміст a [i].

Оскільки ім'я масиву є не що інше як адреса його початкового елемента, присвоювання

pa = & a [0];

можна також записати в наступному вигляді:

pa = a;

Так як ра - покажчик, то у виразах його можна використовувати з індексом, тобто запис pa [i] еквівалентна запису * (pa + i). Елемент масиву однаково дозволяється зображати і у вигляді покажчика зі зміщенням, і у вигляді імені масиву з індексом.

Між ім'ям масиву і покажчиком, виступаючим в ролі імені масиву, існує одна відмінність. Покажчик - це змінна, тому можна написати pa = a або pa ++. Але ім'я масиву не є змінною, і запис типу a = pa не допускається.

Слід також розрізняти вираження * (a + 2) і * a + 2:

 * (А + 2) - значення третього елемента масиву а;

 * А + 2 - додавання числа 2 до значення першого елемента масиву.

Приклад 4. Вивести значення одновимірного масиву звичайним способом і з використанням покажчиків.

#include

int a [6] = {10,20,30,40,50,60};

/ * Оголошення і ініціалізація масиву * /

main ()

{Int i, * p;

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

printf ( "% d", a [i]); / * Висновок масиву звичайним способом * /

for (p = & a [0]; p <= & a [5]; p ++)

printf ( "% d", * p); / * Висновок масиву з використанням покажчика * /

for (p = & a [0], i = 0; i <6; i ++)

printf ( "% d", p [i]); / * Ще один варіант з використанням покажчика * /

}

Дамо ще деякі пояснення. Операція р ++ збільшує значення покажчика на одиницю. Якщо p = & a [i], то після операції р ++ в р міститься адреса елемента a [i + 1].

Приклад 5. Знайти середнє арифметичне масиву, що складається з шести елементів, з використанням покажчика.

#include

int a [] = {10,20,30,40,50,60}

main ()

{Int i, * p;

float s;

p = a; / * Покажчик отримує значення адреси нульового елемента масиву * /

for (s = 0, i = 0; i <6; i ++)

s + = * (p + i); / * Отримання суми елементів масиву * /

s = s / 6; / * Середнє арифметичне масиву * /

printf ( "% f", s);

}

Приклад 6. Вирішити завдання, наведену в прикладі 1, з використанням покажчика.

#include

main ()

{Float s [10];

int * p, i;

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

scanf ( "% f", s [i]);

p = & s [9]; / * Покажчик отримує значення адреси останнього елемента масиву * /

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

printf ( "% f", * (p-i)); / * Висновок елементів в зворотному порядку * /

for (p = & a [9]; p> = & a [0]; p--) / * ще один спосіб виведення елементів в зворотному порядку * /

printf ( "/ n% d", * p);

}

Припустимо, що у нас є описи:

int z [4] [2]; / * * /

int pz;/ * * /

Тоді pz = z вказує на нульовий стовпець нульової рядки, т. Е

pz = & z [0] [0];

Приклад 7. Вивести на екран значення нульового, другого і четвертого елементів масиву.

#include

int a [] = (10,20,30,40,50,60); / * Оголошення і ініціалізація масиву а * /

main ()

{

for (p = a, i = 0; p + i <= a + 4; p ++, i ++)

printf ( "% d"; (p + i));/ * Висновок на екран значень нульового, другого і четвертого елементів * /

}

У циклі відбувається одночасне збільшення покажчика р і індексу i на одиницю, внаслідок чого на екран після нульового елемента виводиться другий, і потім четвертий. Оскільки елементи двовимірного масиву зберігаються в пам'яті ЕОМ по рядках, то

pz + 1 = & z [0] [1], pz + 2 = & z [1] [0], pz + 3 = & z [1] [1] і т. д

Двовимірний масив описаний як масив масивів. Якщо z є ім'ям масиву, то які імена чотирьох рядків, кожна з яких є масивом з двох елементів? Ім'я першого рядка z [0], другий - z [1], і т. Д Проте ім'я масиву є також покажчиком на цей масив в тому сенсі, що воно посилається на перший його елемент. значить:

z [0] = & z [0] [0], z [1] = & z [1] [0], z [2] = & z [2] [0], z [3] = & z [3] [0 ].

Приклад 8. Задана матриця а. Вивести на екран елементи головної діагоналі, першого рядка і значень перших елементів кожного рядка матриці, застосувавши для цього покажчики.

#include

int a [3] [3] = {{10,20,30},

{40,50,60},

{70,80,90}};

/ * Оголошення і ініціалізація двовимірного масиву * /

int * pa [3] = {a [0], a [1], a [2]};

/ * Оголошення і ініціалізація покажчика ра на рядки масиву а й привласнення початкових значень: pa [0] = a [0]; pa [1] = a [1]; pa [2] = a [2] * /

int p = a [0];/ * Оголошення покажчика на нульовий елемент нульової рядки масиву а * /

main ()

{Int i;

for (i = 0; i <9; i + = 4)

printf ( "% d", * (p + i)); / * Висновок на екран елементів головної діагоналі * /

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

printf ( "% d", * p [i]); / * Висновок на екран елементів першого рядка * /

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

printf ( "% d", pa [i]); / * Висновок на екран перших елементів кожного рядка матриці * /

}

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

a [0] [0], a [0] [1], a [0] [2], a [1] [0], a [1] [1], a [1] [2], a [ 2] [0], a [2] [1], a [2] [2]

Тоді елементи, які стоять на головній діагоналі, займають нульове, четверте і восьме місця, т. Е інтервал між важливими нас елементами дорівнює чотирьом, тому змінна i змінюється з кроком 4. Відповідно з таким же кроком змінюються адреси осередків, вміст яких виводиться на екран .

Тема 5: підпрограми-функцпіі




 Вступ |  Алфавіт мови і типи даних |  Ввід данних |  Оператори і вирази |  Умовний оператор if |  Оператор вибору switch |  Персональна ЕОМ ПЕОМ ЄС 1840.05 |  Відомості про громадянина ind1 |  Файли послідовного доступу |  Демонстрація виведення в стандартний файл для помилок |

© um.co.ua - учбові матеріали та реферати