Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Передача массива в функцию ?  (Прочитано 61894 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
alliance
Постоялец

ru
Offline Offline

« : 21-05-2008 12:07 » 

Как передается массив в функцию ? В одном учебнике написано через ссылку, в другом через указатель, но амперсант и указатель не одно и то же можете помочь .
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 21-05-2008 12:23 » 

через указатель передавай Улыбаюсь

int Array[10];
f(Array,10);

...

f(int* array, int nLen)
{
}
Записан

alliance
Постоялец

ru
Offline Offline

« Ответ #2 : 21-05-2008 12:25 » 

у меня вопрос к лабораторной передача массива в функцию.....т е можно сказать массив передается в функцию через указателб, который указывает на адресс массива ?
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #3 : 21-05-2008 12:27 » 

alliance, не массив передается в функцию, а указатель на массив передается в функцию.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 21-05-2008 12:38 » 

alliance, Надо сначала выяснить что же такое массив в С++ Ага

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
alliance
Постоялец

ru
Offline Offline

« Ответ #5 : 21-05-2008 13:07 » 

массив- это последовательность ячеек общего типа, объединенных общим именем
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #6 : 21-05-2008 13:12 » 

alliance, и где эти ячейки?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 21-05-2008 13:21 » 

Вдогонку к вопросу McZim: чем фактически является имя переменной-массива?
Записан
alliance
Постоялец

ru
Offline Offline

« Ответ #8 : 21-05-2008 13:41 » 

указателем на первый элемент массива
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 21-05-2008 13:48 » 

Итак, собираем вместе: в функцию тебе нужно передать нечто такое, что позволяло бы работать с массивом.
При этом в функцию можно передавать параметры (константные случаи пока не берём): по ссылке и по значению. В принципе, если требуется изменять самое значение некоторой переменной, то передавать нужно как раз либо по ссылке, либо значение указателя на ту переменную, которую хотим изменять.

Нужно ли тебе изменять указатель на первый элемент массива, и в зависимости от этого, как тебе массив передавать в функцию, решай сам Улыбаюсь Способов, как сам понимаешь, есть много, каждый лучшим образом подходит для чего-то своего Улыбаюсь
« Последнее редактирование: 21-05-2008 13:49 от Вад » Записан
alliance
Постоялец

ru
Offline Offline

« Ответ #10 : 21-05-2008 14:16 » 

хм, значит можно по ссылке и по указателю ? Здесь была моя ладья...
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 21-05-2008 14:33 » 

alliance, это было общее определение. А в С++?

Ладно, а то у тебя наверное башка кипит уже. Да и права Таня, какие-то злые мы стали в последнее время. Нельзя так.

На самом деле всё очень просто. Никаких таких особых ячеек нет, а есть просто ячейки памяти и они расположены ТОЧНО друг за дружкой.
Размер каждой ячейки известен - это размер типа, например на 32 разрядной машине для int это будет 4 байта.

Совершенно верно, имя массива является одновременно и указателем на первый элемент массива - или что тоже самое, на блок памяти.
Тебя наверное сбивает разница между указателем и ссылкой? Представь себе что это практически одно и тоже. Это просто адрес некоего участка памяти. И если ты его знаешь то можешь получить доступ к любому участку (читай к любой ячейке) памяти или элементу массива простым вычислением адреса.
Например к пятому элементу попадаем:

начальный адрес + 5*размер типа

Те передавать в функцию достаточно адрес. Каким образом ты получишь этот адрес зависит от конкретных условий создания массива.
Чаще всего это указатель.

vod MyFunc(int *p, int nSize)

int *p = new int[20];
MyFunc(p, 20);

Если же ты хочешь непример, чтобы в ф-ции происходили изменения этого массива, то тогда тебе надо передавать ссылку на указатель (или что тоже самое указатель на указатель) на указатель

те для ф-ции vod MyFunc(int **p, int nSize)
int *p = new int[20];
MyFunc(&p, 20);

« Последнее редактирование: 21-05-2008 14:35 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 21-05-2008 15:13 » 

alliance, небольшое пояснение (Джон мог не обратить внимание, потому что это нам и так уже понятно)
к пятому элементу будет так доступ:

начальный адрес + (5-1)*размер типа

, так как с нуля начинаеются индексы

к первому:
начальный адрес + (1-1)*размер типа == начальный адрес
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #13 : 21-05-2008 15:44 » 

Да, строго говоря, именно так правильно (5-1). Я просто принцип хотел показать.

зы Лёш, а я нулевой элемент не считаю, те считаю  - в смысле я считаю так "нулевой элемент" "первый элемент" ...  "пятый элемент". Ага Те в моём примере это был шестой! Выкрутился? Ага
« Последнее редактирование: 21-05-2008 15:50 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 21-05-2008 15:53 » 

Джон, да я всё понимаю, просто вспоминаю себя же - поначалу в голове каша была ) Поэтому лучше сразу обратить внимание )
Записан

alliance
Постоялец

ru
Offline Offline

« Ответ #15 : 21-05-2008 17:06 » 

и как трудно си учит ообще ? просто вначале все было трудно, сейчас с функциями и с памятью столкнулся и чет немного каша  Флаг тебе в руки!
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #16 : 21-05-2008 17:57 » new

alliance, на самом деле, должно быть не трудно, а интересно, а каша она бывает да и пройдет.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 21-05-2008 18:00 » 

alliance, учить несложно, писать поначалу - бывает у кого как кое где затыки. А потом - будешь как рыба - сначала в нефти, потом в сиропе, а потом почти в воде Улыбаюсь
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #18 : 22-05-2008 05:19 » 

Вообще уже обсуждалось.
https://forum.shelek.ru/index.php/topic,10178.msg167877.html#msg167877

Давно пора фак написать.
Записан

Странно всё это....
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #19 : 28-05-2008 11:48 » 

Все сказанное в общем верно,у меня только два маленьких уточнения
1. имя массива это константный(!!!) поинтер на первый элемент массива
2. Насколько я помню размер не всех типов данных продиктован платформой (вот про int точно не скажу, ну не помню я..., а вот long, bool, double и всетаки помоему int тоже ))), но повторюсь за int не ручаюсь зависит от компилятора), строго говоря платформа тут вообще не причем, все зависит только от компилятора и стандарта (им например гарантирован размер char).
Записан

С уважением Lapulya
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 29-05-2008 17:26 » 

lapulya, размеры типов более-менее стандартизированы:
char - 1
short - 2
int - соответсвует целому для конкретной платформы
long - 4
float - 4
double - 8
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #21 : 30-05-2008 10:11 » 

RXL, настаивать не буду (точно не помню), но помоему стандарт гарантирует размерность только 1 - 2 типов: char и может еще какойто, все остальные зависят толи от компилятора, толи от платформы (допускаю, хотя скорее всего так оно  и есть, что часть зависит от платформы, а точнее это int, а все остальные от компилятора), поэтому и всегда надо брать sizeof а не полагаться на конкретный размер.

))) Был бы Серега, он бы рассудил ))) он спит со стандатром под подушкой...
« Последнее редактирование: 30-05-2008 10:14 от lapulya » Записан

С уважением Lapulya
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 30-05-2008 17:48 » 

lapulya, конечно - все зависит от компилятора: с какой точностью и какой стандарт он реализует.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
alliance
Постоялец

ru
Offline Offline

« Ответ #23 : 02-06-2008 19:02 » 

извиняюсь за тупость,можете написать передачу функции по ссылке пример
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #24 : 02-06-2008 19:16 » 

alliance, ээээ может передачу в функцию по ссылке?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #25 : 02-06-2008 19:19 » 

alliance, легко Улыбаюсь

int Array[10];
f(Array,10);

...

f(int*& array, int nLen)
{
   array[7]=...;
}

найди 1 отличие Отлично
Записан

alliance
Постоялец

ru
Offline Offline

« Ответ #26 : 02-06-2008 19:34 » 

хм а ечли убрать знак амперсанта это ведь будет передача по ссылке ?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #27 : 02-06-2008 19:35 » 

Для типа char стандарт размерность определил так
Цитата
3.9.1 Fundamental types
1. Objects declared as characters (char) shall be large enough to store any member of the implementation's basic character set.
Для целочисленных типов, такое определение
Цитата
2. There are four signed integer types: "signed char", "short int", "int", and "long int". In this list, each type provides at least as much storage as those preceding in the list. Plain ints have the natural size suggested by the architecture of the execution environment; the other signed integer types are provided to meet special needs.
« Последнее редактирование: 02-06-2008 19:42 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
alliance
Постоялец

ru
Offline Offline

« Ответ #28 : 02-06-2008 19:44 » 

Код:
#include<iostream.h>
#include<conio.h>
#include<string.h>

#include<conio.h>
void dell(int a[10][10],int m, int n, int i, int j);
int main()
{        clrscr();
int m,n,i,j,k,f,a[10][10],prim;
cout<<"wwedite m,n :\n";
cin>>m;
cout<<"\n";
cin>>n;
cout<<"wwedite matrizu\n";

for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>a[i][j];
cout<<"wwedite i ,j\n";
cin>>i;
cout<<" ";
cin>>j;
dell(a,m,n,i,j);
getch();

return 0;
}
void dell(int a[10][10],int m, int n, int i, int j)
{

int k,b;

for(k=0;k<m;k++)
{
cout<<"\n";
for(b=0;b<n;b++)
if(k!=i && b!=j)
  cout<<a[k][b];
}


}


Здесь я передаю по значению ? совсем запутался  Здесь была моя ладья...


« Последнее редактирование: 02-06-2008 20:06 от Алексей1153++ » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #29 : 02-06-2008 19:52 » 

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

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines