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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2009, 00:37   #1
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию передача массива в функцию

Здраствуйте, по ходу изучения с++ возник вопрос.
Чем отличается передача массива по ссылке:

Код:
int array[10];
some_function(array,10);
void some_function(int arr[], int size){}
от передачи с указателем:

Код:
int array[10];
some_function(array,10);
void some_function(int *arr, int size){}
1)Чем отличается передача массива по ссылке от передачи с указателем?
2)Можно ли пользоваться только указателями (мне привычнее)?
3)Если нет, то в каких случаях нужно использовать ссылки?
JOFRIF вне форума Ответить с цитированием
Старый 02.08.2009, 00:46   #2
bondik
Форумчанин
 
Регистрация: 24.04.2008
Сообщений: 300
По умолчанию

в первом варианте можно отказаться от второго аргумента, а во втором нет,но если дописать первым элементом количество элементов,то тоже можно(простите за демагогию ).
Но опять же если функционал программы в большей степени использовать через ссылки,то скорость разработки уменьшается,т.к. тратиться больше время на вылавливание ошибок.
bondik вне форума Ответить с цитированием
Старый 02.08.2009, 00:58   #3
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Цитата:
в первом варианте можно отказаться от второго аргумента
Почему? размер массива нужен для того чтобы можно было обрабатывать заданное число жлементов в массиве.

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

Цитата:
Но опять же если функционал программы в большей степени использовать через ссылки,то скорость разработки уменьшается,т.к. тратиться больше время на вылавливание ошибок.
Значит буду пользоваться указателями.
JOFRIF вне форума Ответить с цитированием
Старый 02.08.2009, 01:16   #4
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Цитата:
Цитата:
но если дописать первым элементом количество элементов,то тоже можно(простите за демагогию ).
не совсем понял что вы имеете в виду...
Имеется ввиду, что в первом элементе массива будет содержаться число - размерность этого массива. Это, разумеется не есть хорошо и так делать не следует.

Код:
int array[10];
some_function(array,10);
void some_function(int arr[], int size){}
Это называется передача по значению, т.е. функции передается копия исходного массива, так что функция не может изменить оригинальный массив в случае чего, а имеет возможность только изменять переданную ей копию, эта копия будет уничтожена, после завершения функции. Кроме того это, как понятно, вызывает выделение дополнительной памяти в стеке.

А вот во втором случае
Код:
int array[10];
some_function(array,10);
void some_function(int *arr, int size){}
И есть передача по ссылке, говорить "передача по указателю" несколько коряво В данном случае функции передается указатель на память, где хранится наш массив, т.е. ссылка на него. Отсюда и название. В данном случае никаких копий массивов не создается и функция может вносить изменения в исходный массив. Если вы хотите защитится от случайного изменения параметра - указывайте перед ним ключевое слово const, функция получит ссылку на него, но попытка изменить что-то в этом параметре вызовет исключение.
Выше я пояснил на ваших примерах, но они не корректны несколько, т.к. это общий случай, а конкретно массив всегда передается по ссылке, в виде указателя на первый элемент, поэтому всегда следует определять размерность массива. Параметры всех остальных типов, по умолчанию, передаются по значению.

Последний раз редактировалось oleg kutkov; 02.08.2009 в 01:23.
oleg kutkov вне форума Ответить с цитированием
Старый 02.08.2009, 01:29   #5
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Цитата:
Код:

Код:
int array[10];
some_function(array,10);
void some_function(int arr[], int size){}
Это называется передача по значению, т.е. функции передается копия исходного массива, так что функция не может изменить оригинальный массив в случае чего, а имеет возможность только изменять переданную ей копию, эта копия будет уничтожена, после завершения функции. Кроме того это, как понятно, вызывает выделение дополнительной памяти в стеке.
Учу по книге "Дейтел Х, Дейтел П. Как программировать на C++."
В книге, в одном из листингов, написано:

Цитата:
Код:
modifyarray(a, arraysize) // Массив, передается по ссылке

Цитата:
Если вы хотите защитится от случайного изменения параметра - указывайте перед ним ключевое слово const, функция получит ссылку на него, но попытка изменить что-то в этом параметре вызовет исключение.
В таком случае получается шило на мыло.
Можно использовать const , а можно пользоваться передачей по значению
JOFRIF вне форума Ответить с цитированием
Старый 02.08.2009, 01:32   #6
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Да, только передача по значению - это, как я уже сказал, выделение дополнительной памяти, что в случае больших объемов данных (гигантский массив структур, к примеру), ничем хорошим не обернется. Памяти много не бывает
oleg kutkov вне форума Ответить с цитированием
Старый 02.08.2009, 01:38   #7
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Цитата:
Сообщение от oleg kutkov Посмотреть сообщение
Да, только передача по значению - это, как я уже сказал, выделение дополнительной памяти, что в случае больших объемов данных (гигантский массив структур, к примеру), ничем хорошим не обернется. Памяти много не бывает
Спасибо учту на счет памяти.

Кстати...
Цитата:
Да, только передача по значению - это, как я уже сказал, выделение дополнительной памяти
При передаче по значению, копируется весь массив?

Как все происходит с параметром указателем типа const?

P.S Второй вопрос не актуален (я понял)
первый тоже (невнимательность)

Последний раз редактировалось JOFRIF; 02.08.2009 в 01:40.
JOFRIF вне форума Ответить с цитированием
Старый 02.08.2009, 08:25   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Массив по значению никогда не передаётся, а соответственно никакая память не выделяется. По факту параметр "int a[]" приводится компилятором к "int *a". Так что никакой разницы тут нет. Массивы всегда передаются по указателю на первый элемент.
pu4koff вне форума Ответить с цитированием
Старый 02.08.2009, 12:46   #9
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Вот из Книги Шильдта "Полный справочник по C"

Цитата:
В языке С нельзя передать весь массив как аргумент функции. Однако можно передать указатель на массив, т.е. имя массива без индекса. Например, в представленной программе в func1() передается указатель на массив i:

Код:
int main(void)
{
int i[10];
func1(i);
/*...*/
}
Если в функцию передается указатель на одномерный массив, тов самой функции его можно объявить одним из трех вариантов: как указатель, как массив определеного размера и как массив без определенного размера. НАпример, что бы функция func1() получила доступ к значениям, хранящимся в массиве i, она может быть объявленна как

Код:
void func1(int *x)/* указатель */
{
/*...*/
}
Или как

Код:
void func1(int x[10])/* массив определенного размера*/
{
/*...*/
}

Код:
void func1(int x[])/* массив без определенного размера */
{
/*...*/
}

Эти три объявления тождественны, потому что каждое сообщает компилятору одно и тоже: в функцию будет передан указатель на переменную целого типа. Как правило длинна массива не имеет для функции никакого значения, потому что в С не выполняется проверка границ массива.


Читаем далее

Цитата:
char p[10];

Следующие два выражения идентичны:
p
&p[0]

Выражение
p==&p[0]
принимает значение истина, поскольку адрес первого элемента это тоже самое, чтои адрес массива

Из прочитаного следует вывод, что оба, представленные ТС, варианта передачи массива в функцию - ничем не отличаются.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 02.08.2009 в 13:21.
ROD вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача массива структур в функцию, conio.h, и графика. jojahti Общие вопросы C/C++ 1 01.08.2009 21:35
Передача массива в функцию Vistar Общие вопросы C/C++ 1 27.04.2009 08:08
Передача массива из чисел в функцию x007 Общие вопросы C/C++ 3 21.04.2009 23:39
Передача массива строк в функцию. Crasty Общие вопросы C/C++ 2 14.04.2009 13:29
Передача двухмерного массива в функцию IgorKr Общие вопросы C/C++ 2 28.03.2008 01:11