Передача массива в функцию
Пример инициализации массива
Общая форма инициализации массива при объявлении
Sizeof(float)
П-1
Р2-р1
-I
-J------ L
sizeof(data)
■*i
Рис. 1.5
Форма обращения к элементам массива с помощью указателей следующая:
• data[0] ==*p\;
• data[\]==*(p\ + 1);
• data[2] = *(pl +2);
• data[i\ == *(p\ + /);
• data[n-\] == *(p\ + n- 1). Операции над указателями p 1 и/?2:
•p\ =p2 — проверка на равенство; •p\\=pl — проверка на неравенство; •р\ <р2 — сравнение указателей на меньше; •р\ <=р2 — сравнение указателей на меньше или равно; •р\ >р2 — сравнение указателей на больше; •р\ >=р2 — сравнение указателей на больше или равно; •р2 - pi — вычисление количества элементов между р2 и/Л; •р\ + i — наращивание указателя на / элементов; •р\ - i — уменьшение указателя на / элементов.
При работе с указателями и массивами следует внимательно следить за тем, чтобы адреса, хранимые в указателях, не выходили за рамки адресов массивов.
Пример.Связь между указателями и именами массивов
#include <std | io. h> | |
main() { int i; | ||
float data | [5], *p; | |
printf("\n | Начальный адрес массива data - %u .", | |
data); | ||
printf("\n | Адрес элемента | массива data[0] - %u .", |
&data [0]) ; | ||
printf("\n | Адрес третьего | элемента массива - %u .", |
&data [3]) ; | ||
p=data; /* | р= & data [0]; | */ |
for ( i=0; { printf( | i<=4; i=i+l) | |
"\п Адрес %d-ro | элемента массива data | |
равен % | a .", i+1, p+i); | |
printf( | "\n Значение %d- | -го элемента массива |
data равно %f .", i+1, } } | &data[i]); |
Инициализация массивов
Существует два способа инициализации массива:
1) указание начальных значений при объявлении массива;
2) организация цикла последовательного ввода значений элементов массива.
тип | имя[п] | ={ значение 1, значение 2, значение 3, • • • i значение п}; |
Начальные значения элементов массива заключаются в фигурные скобки. Если программист не указал в квадратных скобках размер массива, то компилятор сам задаст размер по количеству приведенных значений. Если начальные значения в фигурных скобках не заданы, то все элементы массива будут нулевыми.
# include <stdio.h> main ()
{
int data [5] ={5, 4, 3, 2, lb-float a[ ]={3, 4, 2, 7, 18, 90}; char p[ ]={'f, 'f, 'c', 't', f\0'}; char *q;
q=p-
printf("\n Размер массива data %u байт.", sizeof(data));
printf("\n Размер массива a%u байт.", sizeof(a] printf("\n Размер массива p%u байт.", sizeof(p] printf("\n Адрес массива р равен %р.", р); printf("\n Адрес в указателе q равен %р.", q);
}
Цикл последовательного ввода значений элементов массива удобно организовать с помощью оператора/ог.
Пример
#include <stdio.h> main ()
{
int data[5], *p, j; p=data;
for (j=0; j<=4; j++)
{
printf("\n Введите элемент массива" printf("data[%d] = ",j); scanf("%d", p+j);
Обработку массивов удобно организовывать с помощью специальных функций. Если в функцию передается массив, то на самом деле внутрь функции попадает только адрес массива. Фактически в функцию передаются: 1) адрес массива, 2) размер массива. Исключение составляют функции обработки строк, в которые передаются только адреса.
Обычно параметры функций в языке Си передаются как копии. Если внутри функции произойдет изменение значения параметра, то это никак не отразится на его первоначальном (оригинальном) значении. С массивами дело обстоит иначе. Если в функцию передается адрес массива (адрес нулевого элемента), то все операции, выполняемые в функции над массивом, производятся над оригиналом; поэтому исходный массив может быть случайно поврежден.
Рассмотрим пример программы, в которой функция modify увеличивает на 1 значение каждого элемента массива data.
#include <std | io | .h> | |
void modify(i { int i; | nt | * a, | int size) |
for (i=0; | i< | size, | • i++) |
*(a+i) | =* | (a+i) | + 1; |
/* a[i] } | a[i]+l;V |
main () г | |||||||
int data[] int i; | = {-12, | 14, | -io, | 16, | 22} | , | |
printf("\n | Исходный | массив: | ") ; | ||||
for (i=0; | i<5; i++) | ||||||
printf( | "\n data[ | %d] | =%d"/ | if | data | [i] ) ; | |
modify(dat | a, 5) ; | ||||||
printf ("\n | Модифицированный | массив: | ") ; | ||||
for(i=0; i | <5; i++) | ||||||
} | printf( | "\n data[ | %d] = | =%d", | if | data | [i] ) ; |