пользователей: 21219
предметов: 10452
вопросов: 177398
Конспект-online
зарегистрируйся или войди через vk.com чтобы оставить конспект.
РЕГИСТРАЦИЯ ЭКСКУРСИЯ


Массивы как параметры функций

Массив – набор данных одного и того же типа, обращение к которым происходит  с применением  общего для всех  имени.
Определение массива
тип  name[размер]; 
int  Arr_1[10];
int  Arr_2[] = {1,2,3};
int  Arr_3[3] = {1,2,3};
int  Arr_4[3] = {1,2}; Частичное определение массива. Последний элемент получает значение 0.

const k=10;

 float A[k];

Доступ к элементам массива.
A[0]=1;

A[i]=i*2;//i- индекс –целое число

  • Базовый элемент массива имеет индекс 0.
  • Размеры массива должны быть константами.
  • Индекс массива – целое число от 0 до k-1, где k- число элементов в массиве
  • Обращение к элементу массива осуществляется с помощью индекса (номера) элемента.
  • В языке С не проверяется  выход индекса за пределы  массива

Индекс может быть :

  1. Константой,
  1. Переменной,
  1. Выражением целого типа
  • Нельзя присвоить один массив другому!!!

Если массив при объявлении не инициализирован, то его элементы имеют случайные значения.

Определение количества элементов  массива:

int  arr[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

cout<<sizeof(arr)/sizeof(arr[0])<<endl;

Передача в функцию одномерного массива

Использование массива как параметра функции не вызывает ни каких трудностей. Как было сказано ранее, массив в подпрограмму всегда передаётся по адресу, поэтому достаточно при вызове функции указать адрес начала массива или адрес того элемента, начиная с которого предполагается обрабатывать массив.

Пример. Написать программу, которая будет вызывать функцию для вывода на печать элементов массива.

Возможный вариант решения:

#include <iostream>

using namespace std;

void print(int x[], int n);

int main()

{

   const int n = 5;

   int x[n] = {3, 5, 1 ,7, 4};

   print(x, n);

   return 0;

}

void print(int x[], int n)

{

   cout << "Massiv:" << endl;

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

      cout << x[i] << endl;

}
При вызове функции оператором print(x, n); в неё передаётся адрес начала массива x и количество элементов n. Количество элементов n передаётся по значению и здесь всё должно быть понятно, но вот с передачей самого массива может быть некоторое непонимание, которое необходимо устранить.

Итак, массив в функцию должен передаваться по адресу, и нам необходим в подпрограмме весь массив, поэтому логично вызов функции записать так:

print(&x[0], n);

С учётом того, что массив в подпрограмму чаще всего передаётся весь и с начала, разработчики языка запись вида &x[0] сократили до x, т.е. обращение к массиву по имени эквивалентно обращению по адресу к элементу с индексом 0.
В заголовке функции void print(int x[], int n) // 1-й вариант

два формальных параметра. Запись x[] говорит о том, что в подпрограмму передаётся именно массив. Заголовок может выглядеть и так:

void print(int *x, int n) // 2-й вариант

Массив передаётся по адресу, поэтому и записываем первый параметр как адрес на объект типа int. Этот объект-указатель принимает адрес того элемента массива, который вычисляется в вызывающей функции (например, в main()).

 Компилятор рассматривает 1-й вариант как эквивалент 2-го, хотя для человека нагляднее именно 1-й вариант. По нему видно, что формальный параметр — это именно массив, а не указатель, например, на одиночный элемент.
Трактовка при вызове x как &x[0] позволяет при необходимости передать в подпрограмму не весь массив, а только его часть, начиная с какого-либо адреса. Например, вызов

print(&x[2], n - 2);

приводит к выводу на экран монитора трёх элементов массива, начиная с элемента с индексом 2. При этом сама функция не требует каких либо доработок. В этом плане языки С/С++ гораздо удобнее многих других языков.

 

 


28.12.2014; 22:38
хиты: 50
рейтинг:0
Точные науки
информатика
Языки программирования
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2016. All Rights Reserved. помощь