Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Изучение Си после Паскаля.rtf
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.01 Mб
Скачать

Имя массива является указателем на нулевой элемент массива

Действительно, в Си соблюдается тождество .

Из чего следует, что &a[1] = a + 1, &a[2]=a+2, …, &a[i]=a+i.

Далее, если a + 1 – это адрес a[1], то *(a+1) – это значение a[1]!!!

Соответственно, если a – адрес a[0], *a – это a[0]

a=&a[0] *a=a[0]

a+1 = &a[1] *(a+1) = a[1]

a+I = &a[i] *(a+i) = a[I]

Любой указатель можно использовать как имя массива. Например:

int a[10];

int * b = a; // b указывает на нулевой элемент массива A

int i;

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

b[i] = 0; // обнулить все элементы массива A!

Передача массива в функцию через параметр

Если в функции обрабатывается массив, то в нее он передается посредством указателя на нулевой элемент массива. Рассмотрим на примере – разработаем функцию генерации случайного массива из 10 элементов и функцию вывода массива на экран.

#include <stdio.h>

// a – указатель на нулевой элемент массива

void generate(int * a)

{

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

a[i] = random(10);

}

// a – указатель на нулевой элемент массива

void print (int a[])

{

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

printf(“%d ”, a[i]);

printf(“\n\n”);

}

int main()

{

int a[10];

generate(a); // В функции передается указатель на нулевой

print(a); // элемент массива A

return 0;

}

В функции передача массива может быть обозначена одним из трех взаимозаменяемых способов:

1> void generate(int * a);

2> void generate(int a[]);

3> void generate(int a[10]);

Причем в третьем методе в [ ] может стоять любое натуральное число – все равно оно в программе никаким образом не контролируется!

Примеры обработки массивов в Си

Рассмотрим обработку на примере массива, содержащего не более 10 элементов. Реально используемое количество элементов хранится в переменной n.

Ввод массива с клавиатуры:

// a – массив, n – указатель на количество элементов

void readArray(int a[], int * n)

{

int i;

printf("\nВведите n = ");

scanf("%d", n); // Обратите внимание! Перед n НЕ СТОИТ &,

// потому что n передан в эту функцию как указатель

for (i = 0; i < *n; i++) // А здесь перед n стоит *,

scanf("%d", &a[i]); // потому что n – это указатель, а требуется

// значение

}

Вызов этой функции:

int a[10];

int n;

readArray(a, &n); /* В функцию readArray передаются 2 параметра: первый a – указатель на нулевой элемент массива a, второй – указатель на n – значение количества элементов n в функции readArray будет изменяться, поэтому передаем указатель на количество элементов массива. */

Вывод массива на экран:

// a – массив, n –количество элементов

void writeArray(int a[10], int n)

{

int i;

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

printf("%d ", a[i]);

printf(“\n”);

}

Вызов функции:

writeArray(a, n); /*В функцию writeArray передаются 2 параметра: первый a – указатель на нулевой элемент массива a, второй – значение количества элементов n. В функции writeArray значение n не будет изменяться, поэтому передавать указатель в функцию не требуется. */

Генерация массива:

// a – массив, n – указатель на количество элементов

void generateArray(int * a, int * n)

{

int i;

*n = random(5) + 6;

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

a[i] = random(10);

}

Вызов функции:

generateArray(a, &n);

Поиск максимального элемента массива:

// a – массив, n – количество элементов

// Возвращается значение максимального элемента

int findMaxElement(int * a, int n)

{

int i;

int max = a[0];

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

if (a[i] > max) max = a[i];

return max;

}

Вызов функции:

int max = findMaxElement(a, n);

Загрузка массива из текстового файла in.txt:

// Загружает массив a из файла in.txt

//Параметры: a – массив, n – указатель на количество элементов

// Данные в файле хранятся в следующем формате:

// 1. Значение числа N

// 2. N значений элементов массива

// Функция возвращает 1, в случае если файл открылся

// 0 – если файл не открылся

int loadArray(int * a, int * n)

{

int i;

// Открывается файл in.txt в режиме чтения

FILE * fin = fopen("in.txt", "r");

// Если файл не открылся – выходим из функции и возвращаем 0

if (fin == NULL) return 0;

// Читаем из файла значение N

fscanf(fin, "%d", &n);

// Читаем из файла N значений элементов массива

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

fscanf(fin, "%d", &a[i]);

// Закрываем файл

fclose(fin);

// Возвращаем 1 – сигнал, что все OK

return 1;

}

Вызов функции:

if (!loadArray(a, &n))

printf("Файл in.txt не открывается!\n");

Сохранение массива в файле out.txt:

// a – массив, n –количество элементов

int saveArray(int * a, int n)

{

int i;

// Открывается файл out.txt в режиме перезаписи

FILE * fout = fopen("out.txt", "w");

// Если файл не открылся – выходим из функции

if (fout == NULL)

{

return 0;

}

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

fprintf(fout, "%2d ", a[i]);

fprintf(fout, "\n");

fclose(fout);

return 1;

}

Вызов функции:

if (!saveArray(a, n))

printf("Файл out.txt не открывается!\n");