Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2009, 13:32   #1
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,757
По умолчанию Передача массивов в функции. Си

Ваши программы будут передавать массивы в функции точно так же, как и любые другие переменные. Функция может инициализировать массив, прибавить к массиву значения или вывести элементы массива на экран. Когда вы передаете массив в функцию, вы должны указать тип массива. Нет необходимости указывать размер массива. Вместо этого вы передаете параметр например number_of_elements, который содержит количество элементов в массиве:

Код:
void some_function(int array[], int number_of_elements);
Следующая программа ARRAYFUN.CPP передает массивы в функцию show_array, которая использует цикл for для вывода значений массивов:

Код:
#include <iostream.h> 

void show_array (int array [] , int number_of_elements) 

{ 
   int i; 
   for (i = 0; i < number_of_elements; i++) cout << array[i] << ' '; 
   cout << endl; 
} 

void main(void) 

{ 
   int little_numbers[5] ={1,2,3,4,5}; 
   int big_numbers[3] = { 1000, 2000, 3000 }; 
   show_array(little_numbers, 5); 
   show_array(big_numbers, 3); 
}
Как видите, программа просто передает массив в функцию по имени, а также указывает параметр, который сообщает функции количество элементов, содержащихся в массиве:
Код:
show_array(little_numbers, 5);
Следующая программа GETARRAY.CPP использует функцию get_values, ч тобы присвоить три значения массиву numbers:
Код:
#include <iostream.h> 

void get_values(int array[], int number_of_elements) 

{ 
   int i; 
   for (i = 0; i < number_of_elements; i++) 

   { 
       cout<<"Введите значение " << i << ": "; 
       cin >> array [i]; 
   } 
} 

void main(void) 

{ 
   int numbers[3]; 
   get_values(numbers, 3); 
   cout << "Значения массива" << endl; 
   for (int i = 0; i < 3; i++) 
   cout << numbers [i] << endl; 
}
Как видите, программа передает массив в функцию по имени. Функция в свою очередь присваивает массиву элементы. Из урока 10 вы узнали, что, пока ваша программа не передаст параметры в функцию с помощью адреса, функция не может изменить эти параметры. Однако, как можно заметить в данном случае, функция get_values изменяет параметр-массив numbers. Как вы узнаете из урока 20, C++ действительно передает массивы в функцию, используя указатели. Таким образом, функция может изменить элементы массива, если ей это нужно.

http://programmersclub.ru/16/

Последний раз редактировалось MaTBeu; 08.02.2009 в 14:58.
Alar вне форума Ответить с цитированием
Старый 08.02.2009, 14:15   #2
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,757
По умолчанию

void - это это процедура, если нужна функция в классическом понимании необходимо вместо void указывать тип возвращаемого результата, например float или int.
Alar вне форума Ответить с цитированием
Старый 08.02.2009, 15:49   #3
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

еще можно использовать передачу не самого массива, а указателя на него

Код:
void show_array (int *array [] , int number_of_elements) 

{ 
   int i; 
   for (i = 0; i < number_of_elements; i++) 
     cout << *(array+i) << ' '; 
   cout << endl; 
} 

void main(void)
{ 
   int little_numbers[5] ={1,2,3,4,5}; 
   int big_numbers[3] = { 1000, 2000, 3000 }; 
   show_array(&little_numbers, 5); 
   show_array(&big_numbers, 3); 
}
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 08.02.2009, 16:01   #4
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

массив на языке си всегда передается по адресу его первого элемента, поэтому программист должен всегда передавать адрес его первого элемента, если он статический ( указатель или ссылка ) и указатель на первый элемент, если он динамический

Последний раз редактировалось capta1n; 08.02.2009 в 16:03.
capta1n вне форума Ответить с цитированием
Старый 11.02.2009, 23:58   #5
Тупой
Форумчанин
 
Аватар для Тупой
 
Регистрация: 26.12.2008
Сообщений: 146
По умолчанию

А обязательно длину массива передавать? Разве в си нет чтото типа .length?
"Hello, world!" - 17 errors 56 warnings
Тупой вне форума Ответить с цитированием
Старый 12.02.2009, 00:26   #6
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

Нет. Такого нету. Надо передавать размерность массива. Lenght - это удел пользовательских классов. В чистом Си такого нет.
MaTBeu вне форума Ответить с цитированием
Старый 02.05.2010, 21:41   #7
velodron
Новичок
Джуниор
 
Регистрация: 02.05.2010
Сообщений: 1
По умолчанию

сделать по аналоги с одномерным массивом двумерный не удаётся.
С чем связано? подскажите пожалуйста..
velodron вне форума Ответить с цитированием
Старый 02.05.2010, 22:06   #8
silent_1991
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 68
По умолчанию

Чтобы двумерный передать, надо записать что-то вроде
void show_array (int **array , int rows, int cols)
rows и cols - количество строк и столбцов соответственно
silent_1991 вне форума Ответить с цитированием
Старый 08.02.2011, 11:10   #9
maxmun
 
Регистрация: 08.02.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от silent_1991 Посмотреть сообщение
Чтобы двумерный передать, надо записать что-то вроде
void show_array (int **array , int rows, int cols)
rows и cols - количество строк и столбцов соответственно
Код:
#include "iostream"
#include "conio.h"
#include "stdlib.h"
using namespace std;

void randmass(int ** mass, int rows, int cols)
{
	for (int i=0; i<rows; i++){
		for (int j=0; j<cols; j++){
			mass[i][j]=rand();
		}
	}
}

int main()
{
	
	int matrix[5][5];
	randmass(matrix, 5, 5); // аргумент типа "int (*)[5]" несовместим с параметром типа "int **"

	return 0;
}
где ошибка?

Последний раз редактировалось maxmun; 08.02.2011 в 13:59.
maxmun вне форума Ответить с цитированием
Старый 08.02.2011, 11:23   #10
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

Код:
void randmass(int ** mass, int rows, int cols)
{
	for (int i=0; i<rows; i++){
		for (int j=0; j<cols; j++){
			mass[i][j]=rand();
		}
	}
}

int main()
{
	int n=5;
	
        int **matrix=new int*[n];
	for (int i=0;i<n;i++)
		matrix[i]=new int[n];

	randmass(matrix, 5, 5); //объявил явно как указатель на указатель
}
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
пересечение массивов на С++ drakon803 Помощь студентам 4 09.12.2012 10:29
использование массивов! ...Оленька... Паскаль, Turbo Pascal, PascalABC.NET 2 22.12.2008 11:02
Передача функции TServerSocket и TFileStream dns-s Работа с сетью в Delphi 2 26.03.2008 21:15