Программирование на языке Си. Практикум
.pdf2. Сложение (вычитание) возможно только для матриц одинакового размера. Результатом сложения двух матриц An x m и Bn x m является матрица С таких же размеров, каждый элемент которой равен сумме (разности) соответствующих элементов матриц А и В:
cij aij |
bij |
|
cij aij |
bij . |
|
|
|
|
|
|
|
||||
3. Умножение матрицы на число - все элементы матрицы |
|
||||||||||||||
умножаются на это число: Сn x m |
An x m k, |
|
cij aij |
k |
|
|
|||||||||
4. Транспонирование. Матрица Вm x n называется |
|
||||||||||||||
транспонированной к матрице Аn x m и обозначается B = АT, если |
|
||||||||||||||
строки матрицы В совпадают со столбцами матрицы А, т.е. это |
|
||||||||||||||
поворот - строки становятся столбцами, а столбцы – строками. |
|
|
|||||||||||||
|
|
|
1 |
2 |
7 |
|
|
|
1 |
9 |
5 |
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
A |
|
9 |
4 3 , |
B |
|
AT 2 4 6 |
8 , |
т.е . b a |
|
||||||
4 x 3 |
|
5 |
6 |
7 |
3 x 4 |
|
|
|
|
|
|
ji |
ij |
||
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
7 |
3 |
7 |
1 |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
8 |
|
|
|
|
|
|
|
|
|
|
||
|
|
|
4 |
1 |
|
|
|
|
|
|
|
|
|
|
|
5. Перемножение двух матриц. Произведением матрицы An x k на |
|
||||||||||||||
матрицу Вk x m называют матрицу С, размером n x m. Выполнить |
|
||||||||||||||
умножение можно только тогда, когда длина строки первого |
|
||||||||||||||
сомножителя равна длине столбца второго. Результат должен |
|
||||||||||||||
иметь число строк, как у первого сомножителя, а число столбцов |
|
||||||||||||||
как у второго. Формулу для вычисления каждого элемента |
|
||||||||||||||
выведем последовательно: |
|
|
|
|
|
|
|
|
|||||||
|
|
k |
|
|
|
|
k |
|
|
|
|
k |
|
|
|
с11 a1h bh1 , |
с12 a1h bh2 , т.е. |
с1 j a1h bhj |
|
||||||||||||
|
|
h 1 |
|
|
|
h 1 |
|
|
|
h 1 |
|
|
|||
|
|
k |
|
|
|
|
|
k |
|
|
|
|
k |
|
|
с21 a2 h bh2 , |
с22 a2 h bh2 , т.е . |
с2 j a2 h bhj |
|
||||||||||||
|
|
h 1 |
|
|
|
h 1 |
|
|
|
h 1 |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
k |
|
|
|
сij |
ai 1 b1 j |
ai 2 b2 j ai 3 b3 j |
..... aik |
bkj aih bhj |
|
|
|||||||||
h 1
21
Из алгоритма следует, что данная задача может быть решена только с помощью трех циклов. Фрагмент программы будет выглядеть так:
int a[n][k], b[k][m], c[n][m]; int i, j, h;
for (i=0; i<n; i++) // перебор всех элементов матрицы С for (j=0; j<m; j++)
{
c[i][j]=0;
for (h=0; h<k; h++) // вычисление одного элемента м-цы С c[i][j]+=a[i][h]*b[h][j];
}
Лабораторная работа №4 Вычисление матричных выражений
Задание:
1.Выполнить расчет матричного выражения в Exсel.
2.Написать программу вычисления матричного выражения, используя циклы и индексированные переменные.
3.Сравнить результаты работы программы и расчета в Excel.
№ |
|
Вариант задания |
№ |
|
Вариант задания |
|
||||||
1 |
C 0,8AT (A E), где |
|
2 |
L 2(N 4D) A, г де |
|
|
||||||
|
0,3 |
4 |
0 |
0 |
|
D AT , |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A |
0,8 |
5 |
0 |
0 |
|
2 |
1 |
4 |
2 |
3 |
|
|
|
0 |
0 |
0,3 |
4 |
|
|
|
|
|||
|
|
0 |
0 |
0,8 |
|
|
A |
2 |
, N 9 |
8 |
|
|
|
|
5 |
|
5 |
1 |
0 |
0,5 |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
22
3 |
F 0,5RT T A, г де |
|
|
4 |
K LT T 3B, г де |
|
|
|
|||||||||||||
|
|
8 |
|
6 12 |
3 |
1 1 |
|
0 |
|
6 1 |
|
|
1 1 |
4 |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
R 1 |
|
2 3 |
, A 1 |
2 1 , |
|
L 1 |
|
12 3 , B |
3 2 |
1 , |
||||||||||
|
|
0 |
|
7 |
5 |
|
1 |
1 |
1 |
|
0 |
|
5 7 |
|
|
1 1 |
2 |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
|
3 |
2 |
|
|
|
|
|
3 |
|
3 |
8 |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
T 1 |
|
5 2 |
|
|
|
|
|||||
|
T 2 |
|
1 2 |
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
3 |
|
2 |
5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
3 |
|
2 |
1 |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
L 0,5( A 4D)N , г де |
|
|
6 |
C 3M T P N , г де |
|
|||||||||||||||
|
D AT , |
|
|
|
|
|
|
|
1 |
2 |
3 |
9 |
|
||||||||
|
|
1 |
|
|
3 |
|
2 |
|
|
|
|
|
|||||||||
|
|
|
8 |
|
3 |
|
|
N |
|
|
|
|
, |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
8 |
6 0 1 |
|
||||||||||
|
A 4 |
|
5 6 , N |
9 |
8 |
|
|
|
|
||||||||||||
|
|
2 |
|
1 |
3 |
|
0 |
0,5 |
|
P N |
T |
, mij i j 1 |
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|||||||||||||
7 |
C 0,33E DK, где |
|
|
8 |
C 3LK E, где |
|
|
|
|||||||||||||
|
|
|
1 |
|
|
|
|
|
|
2 |
|
1 |
2 |
|
|
|
|
||||
|
D |
2 2 1 |
2 , |
|
|
|
K 4 |
|
3 4 , |
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
1 |
|
|
|
|
|
|
2 |
|
5 |
1 |
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
K D DT |
|
|
|
|
|
|
L K K T |
|
|
|
|
|
||||||||
9 |
F 5(K M) 0,4L, где |
|
|
10 |
F 5(H B)L, г де |
|
|
|
|||||||||||||
|
|
1 |
|
2 3 0 |
|
|
|
1 |
2 3 0 |
|
|||||||||||
|
|
|
4 |
|
3 |
0 |
|
5 |
|
|
|
|
4 |
3 |
0 |
|
5 |
|
|
||
|
K |
|
|
|
|
|
|
, |
|
|
|
H |
|
, |
|
||||||
|
|
|
0 |
|
2 5 |
4 |
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
2 |
1 |
|
|
|
|
|
|
0 |
2 |
5 |
4 |
|
|||
|
|
7,5 |
|
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
M K |
T |
, |
|
|
|
|
|
|
7,5 |
2 |
1 |
|
4 |
|
||||||
|
|
|
|
|
|
|
|
1 |
|
2 |
0 |
1 |
|
||||||||
|
|
1 |
|
2 |
0 |
1 |
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
0,5 |
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
1 |
2 |
|
||||
|
L |
|
3 |
|
1 |
2 |
0,5 |
|
|
|
B |
|
|
|
|
|
, L H T |
|
|||
|
|
4 |
|
2 1 3 |
|
|
|
|
|
4 |
|
2 1 3 |
|
|
|||||||
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0,5 |
|
1 |
2 |
1 |
|
|
|
|
0,5 |
1 |
2 |
1 |
|
|
|||||
23
11 |
Q KLT |
4D, г де |
|
|
|
12 |
C 3,5NB PT , г де |
|
|
|
|||||||||
|
1 |
8 |
2 |
|
1 |
2 |
|
|
1 |
8 |
|
2 |
1,5 |
2 |
|||||
|
K 4 |
0 3 , D 5 |
4 , |
|
N 4 |
0 3 , B |
5 |
4 |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
21 |
6 |
7 |
|
6 |
7 |
|
|
2 |
6 |
0,7 |
|
6 |
7 |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
8 |
4 1 |
|
|
|
|
|
8 |
4 1 |
|
|
|
|||||||
|
L |
|
|
|
|
|
|
|
|
P |
|
|
3 |
2 |
|
|
|
|
|
|
3,5 3 |
2 |
|
|
|
|
|
5 |
|
|
|
|
|||||||
13 |
C 3KT M N, где |
|
|
14 |
B 0,8E(A AT ), где |
|
|
|
|||||||||||
|
1 |
2 |
3 |
9 |
|
|
|
|
|
0,3 |
4 |
|
0 |
0 |
|
|
|||
|
N |
|
|
|
, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
6 |
0 |
1 |
|
|
|
|
A |
|
0,8 |
5 |
|
0 |
0 |
|
|
||
|
M NT , |
|
|
|
|
|
|
|
|
|
|
0 |
|
0 |
0,3 |
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
|
0 |
|
0,8 |
|
|
|
|
|
1 |
2 |
3 |
|
4 |
|
|
|
|
|
|
|
|
5 |
|
|
|||
|
|
|
|
|
|
|
1 |
|
0 |
0 |
0 |
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
K 2 |
3 4 5 |
|
|
|
|
|
0 |
|
1 0 0 |
|
|
|
||||||
|
3 |
4 |
5 |
|
6 |
|
|
|
|
E |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
|
0 |
1 |
0 |
|
|
|
|
|
4 |
5 |
6 |
|
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
|
0 |
0 |
1 |
|
|
|
|
15 |
A (D 3C)F T , г де |
|
|
|
16 |
D (0,5K A)QT , где |
|
|
|||||||||||
|
8 |
6 |
|
|
1 |
2 |
|
|
|
8 |
6 |
|
|
4 |
|
2 |
|
||
|
|
|
|
|
|
|
A 3 |
2 , K 12 |
|
6 , |
|
||||||||
|
D 3 |
2 , F |
|
, |
|
|
|
|
|||||||||||
|
4 |
5 |
|
|
8 |
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
5 |
|
|
24 |
18 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
1 |
2 |
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
Q |
|
|
|
|
|
|
|||
|
C 3 4 |
|
|
|
|
|
|
|
8 |
3 |
|
|
|
|
|
|
|||
|
6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
L 5,2(D 4A)N, где |
|
18 |
C (2A BT )A, где |
|
|
|
||||||||||||
|
1 |
8 |
3 |
|
|
|
|
|
|
|
3 |
4 |
|
1 |
|
|
|
||
|
|
|
|
|
|
|
T |
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
A 4 |
5 6 , D A , |
|
|
A |
|
|
|
|
|
|
|
|||||||
|
|
|
2 |
5 |
|
3 |
, |
|
|
|
|||||||||
|
2 |
1 |
3 |
|
|
|
|
|
|
|
|
|
0,6 |
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
|
|
|
|
||||
|
2 |
3 |
|
|
|
|
|
|
|
|
2 |
1 |
|
0 |
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N 9 |
8 |
|
|
|
|
|
|
|
B |
3 |
7 1 |
|
|
|
||||
|
0 |
0,5 |
|
|
|
|
|
|
|
7 |
4,5 |
8 |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24
19 |
S 0,1( A KM ), г де |
|
|
20 |
F PT 3A, г де |
|
|
|||||||||
|
3 |
|
2 |
1 |
|
|
|
|
|
2 |
3 |
1 |
|
|
|
|
|
|
|
|
|
|
|
T |
|
|
|
|
|
|
|
|
|
|
A 2 |
|
4 2 , M K |
|
, |
|
P 5 |
2 8 , |
|
|
|
|||||
|
1 |
|
2 |
3 |
|
|
|
|
|
7 |
0 |
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
3,5 |
8 |
11 |
|
|
|||
|
|
|
1 |
2 1 |
|
|
|
|
A |
|
|
|
, T P T |
|
||
|
K 4 |
|
|
|
|
3 |
1 1 |
|
||||||||
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
1 |
7 |
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
F 0,5RT A, г де |
|
|
|
22 |
S A 2,5KN , г де |
|
|||||||||
|
8 |
|
6 |
12 |
|
|
|
|
8 |
10 |
11 |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
R 1 |
|
2 |
3 |
, |
|
|
|
|
A |
2 |
14 |
0,2 , |
|
||
|
0 |
|
7 |
2 |
|
|
|
|
|
15 |
2,5 30 |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
3 1 |
|
|
|
|
|
4 |
6 8 |
|
|
||||
|
|
|
|
|
|
T |
|
|
|
|
|
|
|
|
|
T |
|
A 3 |
|
1 1 , T R |
|
|
|
|
K |
9 |
3 |
11 , N K |
|
||||
|
|
|
1 |
|
|
|
|
|
|
7 |
2 |
5 |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
1 |
|
1 |
|
|
|
|
|
|
|
|
|
|
|||
23 |
L ( AB 0,25B)C, г де |
24 |
M PT (N 3E), где |
|
||||||||||||
|
1 |
|
2 |
3 |
|
|
|
|
1 |
5 |
2 |
3 |
|
|||
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
A 2 |
|
4 |
2 , |
|
|
|
|
0 |
2 |
|
3 |
|
|||
|
|
|
|
|
|
P |
0,6 , |
|
||||||||
|
3 |
|
2 |
1 |
|
|
|
|
|
|
4 |
1 |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
5,2 |
1 |
|
|||||||
|
10 |
|
|
|
|
|
|
2 |
3 |
4 |
|
|
|
|||
|
B 11 4 |
6 , C BT |
|
N 1 |
2 5 |
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
2 |
8 |
|
|
|
|
|
12 |
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25
25 |
C AT (2B E), где |
|
|
26 |
S ( AB 5B)K , г де |
|
|
||||||||
|
1 |
5 2 |
3 |
|
|
1 |
2 3 |
|
40 |
60 |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A 0 |
2 |
3 0,6 , |
|
|
A 2 |
4 |
2 , |
B |
45 |
75 , |
||||
|
5,2 |
4 |
1 |
1 |
|
|
|
3 |
2 |
1 |
|
56 |
99 |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
3 |
4 |
|
|
|
|
K BT |
|
|
|
|
|
|
|
|
B 1 |
2 |
5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
2 |
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
27 |
P FH 4DT , г де |
|
|
28 |
D BF 0,2 AT , г де |
|
|
||||||||
|
1 |
|
8 2 |
|
1 |
2 |
|
|
8 |
4 1 |
|
|
|
||
|
F 4 |
|
0 3 , H |
5 |
4 , |
|
A |
3,5 |
3 |
, |
|
|
|||
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
||
|
21 |
6 |
7 |
|
6 |
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
2 |
1 |
8 |
2 |
||
|
|
8 |
|
4 |
1 |
|
|
|
|||||||
|
|
|
|
|
F 5 |
4 , B |
4 |
0 3 |
|||||||
|
D |
|
|
3 |
|
|
|
|
|||||||
|
3,5 |
2 |
|
|
|
|
|
|
|
|
6 |
|
|||
|
|
|
|
|
|
|
|
|
6 |
7 |
21 |
7 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
29 |
P FH 4DT , где |
|
|
30 |
D BF 0,2AT , где |
|
|
||||||||
|
1 |
8 |
2 |
|
|
|
8 |
4 |
1 |
|
|
|
|||
|
F 4 |
0 |
3 , |
|
|
|
A |
3,5 |
3 |
, |
|
|
|
||
|
|
|
|
|
2 |
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
6 |
7 |
|
|
|
1 |
2 |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
|
4 1 |
|
|
|
F 5 |
4 , |
|
|
|
|
|||
|
D |
|
|
|
, |
|
|
|
6 |
7 |
|
|
|
|
|
|
3,5 |
3 |
2 |
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|||||
|
1 |
2 |
|
|
|
|
|
1 |
8 |
2 |
|
|
|
|
|
|
|
|
|
|
|
B 4 |
0 |
3 |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
H 5 4 |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
21 6 |
7 |
|
|
|
|
||||
|
6 |
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
26
1.4. Указатели
Указатель – это переменная, предназначенная для хранения адреса объекта некоторого типа в памяти ЭВМ. В качестве объекта может быть переменная, массив, функция, структура и т.д. Указатель, как любой объект, должен быть объявлен:
тип_указываемых_данных *идентификатор;
Над указателями можно производить следующие операции:
1.Получение значения по адресу – унарная операция *, называется косвенной адресацией. Результат – значение того типа, на который указывал указатель.
int a, y, *px; // 2 переменные целого типа и указатель
…
a=6;
px=&a; // px получает значение адреса переменной a y=*px; // у присвоено значение, взятое по адресу px Два последних оператора эквивалентны y=a;
Операция косвенной адресации может быть использована и
влевой части оператора присваивания
int a, *pa;
….
a=6;
pa=&a;
*pa=10; // значение а после данного оператора равно 10
2.Получение адреса переменной – операция &, возвращает адрес переменной в памяти
3.Операции сравнения
-равно = =, не равно !=
-меньше <, меньше или равно < =,
-больше >, больше или равно >= 4. Вычитание
int *pa, *px, n;
….n=px-pa; // n число элементов между двумя указателями
5.Увеличение на 1 (px++ переход к следующему элементу) или уменьшение на 1 (pa- - переход к предыдущему элементу)
6.Увеличение px + i (перемещение вперёд к элементу, отстающему от указанного на i элементов)
27
7. Уменьшение pa - i (перемещение к элементу, отстающему от указанного на i элементов в обратную сторону)
Операциями 4-7 необходимо пользоваться аккуратно, работают только при определенных условиях.
1.5. Связь понятия массива с понятием указателя
Понятие массива тесно связано с понятием указателя. Имя массива (например, mas) является константой типа указатель (хранит адрес начала массива в памяти) и может быть использована в операторе присваивания только справа от знака операции присваивания.
float mas[30]; float *pm= mas;
Таким образом, если mаs - имя массива, то &mas[0] - адрес первого элемента массива, и mas без указания индексов тоже адрес первого элемента массива.
Начальный адрес массива определяется компилятором в момент объявления массива и изменен быть не может.
Память под массив выделяется в момент объявления и остается закрепленной за ним до окончания работы программы.
Пусть задано: int m[4];
int *pm=m;
Предположим, что первый байт массива m расположен в памяти с адресом 10000.
Адреса |
10000 |
10001 |
10002 |
10003 |
10004 |
10005 |
10006 |
10007 |
Индекс |
|
0 |
|
1 |
|
2 |
|
3 |
Память |
|
|
|
|
|
|
|
|
Обращение |
m[0] |
m[1] |
m[2] |
m[3] |
||||
к элементу |
*(pm+0) |
*(pm+1) |
*(pm+2) |
*(pm+3) |
||||
массива |
pm[0] |
pm[1] |
pm[2] |
pm[3] |
||||
|
|
|
|
|
||||
Получение |
&m[0] |
&m[1] |
&m[2] |
&m[3] |
||||
адреса |
&pm[0] |
&pm[1] |
&pm[2] |
&pm[3] |
||||
элемента |
pm |
pm+1 |
pm+2 |
pm+3 |
||||
28
Значение каждого элемента массива можно получить, используя любое из трех приведенных выше выражений. Здесь проиллюстрирован тот важный факт, что добавление целого числа к указателю сдвигает содержащийся в нем адрес на соответствующее количество объектов (т.е. увеличивает его на произведение этого целого числа на размер в байтах того объекта, на который указатель показывает). Это одна из причин, по которой в языке Си требуется описывать тип данных, на который показывает указатель. Переход к i –ому элементу требует прибавить к начальному адресу массива индекс этого элемента, поэтому в языке Си индексация начинается с нуля.
Арифметические действия над указателями обеспечивают удобный способ работы с массивами.
В языке Си обычно для объявления массива используются три класса памяти: автоматический (стек), статический и динамический. В первых двух случаях, массивы и их размеры задаются явно в момент их объявления и существуют, пока программа не закончит свое выполнение, поэтому их будем условно считать статическими.
int a[10]; // выделяется автоматическая память для хранения 10 // элементов массива целого типа
static float b[3]; // выделяется статическая память для хранения
3 // элементов массива вещественного типа
Память под динамические массивы выделяется и освобождается по мере необходимости во время работы программы с использованием специальных функций malloc() и calloc().
Например:
1. Определить динамический массив из n элементов вещественного типа с помощью функции malloc()
double *d;
d = (double *)malloc(n*sizeof(double));
или
double *d = (double *)malloc(n*sizeof(double)); /* Здесь выделяется память из n x 8 байт и указателю d присваивается адрес первого байта из выделенного участка */
29
2. Определить динамический массив из n элементов вещественного типа с помощью функции calloc()
double *ab; |
|
ab =(double *)calloc(n,sizeof(double )); |
|
или |
|
double *ab = (double *)calloc(n, sizeof(double )); |
/* Здесь |
выделяется память из n элементов, каждый из которых занимает 8 байт, и указателю ab присваивается адрес расположения в памяти первого элемента, выделенная память обнуляется */
Если описываем два массива:
int *a = (int*)calloc(10, sizeof(int)); static int b[10];
то доступ к их элементам осуществляется одинаково:
а[4] и b[4] доступ к 5 элементу соответствующего массива. После того, как выделенная память больше не требуется, ее
можно освободить с использованием функции free: free(а);
Рассмотрим, как получить значение любого элемента двумерного массива, имея адрес его начала. Пусть есть массив an
x m.
int *a, n, m;
…
a = (int*)calloc(n*m,sizeof(int));
0 1 2 3 … j … m-1
0
1
2
…
i
…
n-1
30
