Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторн_робот_Ч2.doc
Скачиваний:
19
Добавлен:
03.11.2018
Размер:
2.12 Mб
Скачать

2. Теоретичні відомості

Для формування двомірного динамічного масиву в мові С необхідно використовувати оператори:

  1. Підключення бібліотеки:

#include<stdlib.h>

#includе<alloc.h>

  1. Описати двомірний динамічний масив як масив вказівників:

Int**array;

  1. Організувати ввод показників розміру (тобто, n – кількість стрічок, m – кількість стовпців):

int n =0, m=0;

printf(“\n n=”); scanf(“%d”, &n);

printf(“\n m=”); scanf(“%d”, &m);

  1. Розподілити пам'ять під масив вказівників, які вказують на масив стрічок:

array=(int**)malloc(n*sizeof(int*))

  1. Розподілити пам'ять під масив стрічок:

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

array[i]=(int*)malloc(m*sizeof(int));

6) Далі з масивом array[][] можна працювати як з звичайним двомірним масивом:

array[i][j].

Використання масивів як параметрів функцій. Якщо в якості параметра функції використовується масив, то насправді всередину функції передається лише адрес початку масиву. Наприклад, заголовок функції Scalar() для обчислення скалярного добутку двох векторів (масивів a[] та b[], розмір яких n) виглядає так:

float Scalar(int n, float a[ ], float b[ ])...

або

float Scalar(int n, float *a, float *b)...

Конструкції

float b[ ]; і float *b;

цілком рівноправні в специфікаціях параметрів функцій. Однак в першому випадку роль імені b як вказівника не така виразна. У другому варіанті все більш очевидно - b визначається як вказівник типу float *.. .

В тілі функції Scalar() звернення до елементів масивів-параметрів виконувалося за допомогою індексованих елементів a[i] і b[i]. Однак можна звертатися до елементів масивів, використовуючи вирази *(a+i) і *(i+b).

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

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

#include <stdio.h>

/* Визначення функції: */

Void quart(int n, float * х)

{

int i ;

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

/* Присвоєння після множення: */

*(x+i)*=*(x+i);

}

Void main()

{

/* Визначення масиву: */

float z[ ]={1.0, 2.0, 3.0, 4.0};

int j ;

quart(4,z); /* Звернення до функції */

/* Розпечатка зміненого масиву */

for(j=0;j<4;j++)

printf ("\nz [%d] =%f "., j , z [ j ]) ;

}

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

z[0]=l.000000 z[l[=4.000000 z[2]=9.000000 z[3]=16.000000

Щоб ще раз звернути увагу на рівноправність парамет­рів у вигляді масиву і вказівника того ж типу, відмітимо, що заголовок функції в нашій програмі може бути і таким:

Void quart (int n, float X [ ])

В тілі функції розіменовано вираз, що містить ім’я масиву-параметру, тобто замість індексованої змінної х[i] використовується *(x+i). Більш цікава можливість полягає в тому, що можна змінювати всередині тіла функції значення вказівника на масив, тобто в тілі циклу записати, наприклад, такий оператор:

*х*=*х++;