alliance
Постоялец
Offline
|
|
« : 21-05-2008 12:07 » |
|
Как передается массив в функцию ? В одном учебнике написано через ссылку, в другом через указатель, но амперсант и указатель не одно и то же можете помочь .
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #1 : 21-05-2008 12:23 » |
|
через указатель передавай int Array[10]; f(Array,10); ... f(int* array, int nLen) { }
|
|
|
Записан
|
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #2 : 21-05-2008 12:25 » |
|
у меня вопрос к лабораторной передача массива в функцию.....т е можно сказать массив передается в функцию через указателб, который указывает на адресс массива ?
|
|
|
Записан
|
|
|
|
McZim
|
|
« Ответ #3 : 21-05-2008 12:27 » |
|
alliance, не массив передается в функцию, а указатель на массив передается в функцию.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Джон
просто
Администратор
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
Постоялец
Offline
|
|
« Ответ #5 : 21-05-2008 13:07 » |
|
массив- это последовательность ячеек общего типа, объединенных общим именем
|
|
|
Записан
|
|
|
|
McZim
|
|
« Ответ #6 : 21-05-2008 13:12 » |
|
alliance, и где эти ячейки?
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Вад
|
|
« Ответ #7 : 21-05-2008 13:21 » |
|
Вдогонку к вопросу McZim: чем фактически является имя переменной-массива?
|
|
|
Записан
|
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #8 : 21-05-2008 13:41 » |
|
указателем на первый элемент массива
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #9 : 21-05-2008 13:48 » |
|
Итак, собираем вместе: в функцию тебе нужно передать нечто такое, что позволяло бы работать с массивом. При этом в функцию можно передавать параметры (константные случаи пока не берём): по ссылке и по значению. В принципе, если требуется изменять самое значение некоторой переменной, то передавать нужно как раз либо по ссылке, либо значение указателя на ту переменную, которую хотим изменять. Нужно ли тебе изменять указатель на первый элемент массива, и в зависимости от этого, как тебе массив передавать в функцию, решай сам Способов, как сам понимаешь, есть много, каждый лучшим образом подходит для чего-то своего
|
|
« Последнее редактирование: 21-05-2008 13:49 от Вад »
|
Записан
|
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #12 : 21-05-2008 15:13 » |
|
alliance, небольшое пояснение (Джон мог не обратить внимание, потому что это нам и так уже понятно) к пятому элементу будет так доступ:
начальный адрес + (5-1)*размер типа
, так как с нуля начинаеются индексы
к первому: начальный адрес + (1-1)*размер типа == начальный адрес
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #14 : 21-05-2008 15:53 » |
|
Джон, да я всё понимаю, просто вспоминаю себя же - поначалу в голове каша была ) Поэтому лучше сразу обратить внимание )
|
|
|
Записан
|
|
|
|
|
McZim
|
|
« Ответ #16 : 21-05-2008 17:57 » |
|
alliance, на самом деле, должно быть не трудно, а интересно, а каша она бывает да и пройдет.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #17 : 21-05-2008 18:00 » |
|
alliance, учить несложно, писать поначалу - бывает у кого как кое где затыки. А потом - будешь как рыба - сначала в нефти, потом в сиропе, а потом почти в воде
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #18 : 22-05-2008 05:19 » |
|
|
|
|
Записан
|
Странно всё это....
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #19 : 28-05-2008 11:48 » |
|
Все сказанное в общем верно,у меня только два маленьких уточнения 1. имя массива это константный(!!!) поинтер на первый элемент массива 2. Насколько я помню размер не всех типов данных продиктован платформой (вот про int точно не скажу, ну не помню я..., а вот long, bool, double и всетаки помоему int тоже ))), но повторюсь за int не ручаюсь зависит от компилятора), строго говоря платформа тут вообще не причем, все зависит только от компилятора и стандарта (им например гарантирован размер char).
|
|
|
Записан
|
С уважением Lapulya
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #20 : 29-05-2008 17:26 » |
|
lapulya, размеры типов более-менее стандартизированы: char - 1 short - 2 int - соответсвует целому для конкретной платформы long - 4 float - 4 double - 8
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #21 : 30-05-2008 10:11 » |
|
RXL, настаивать не буду (точно не помню), но помоему стандарт гарантирует размерность только 1 - 2 типов: char и может еще какойто, все остальные зависят толи от компилятора, толи от платформы (допускаю, хотя скорее всего так оно и есть, что часть зависит от платформы, а точнее это int, а все остальные от компилятора), поэтому и всегда надо брать sizeof а не полагаться на конкретный размер.
))) Был бы Серега, он бы рассудил ))) он спит со стандатром под подушкой...
|
|
« Последнее редактирование: 30-05-2008 10:14 от lapulya »
|
Записан
|
С уважением Lapulya
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #22 : 30-05-2008 17:48 » |
|
lapulya, конечно - все зависит от компилятора: с какой точностью и какой стандарт он реализует.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #23 : 02-06-2008 19:02 » |
|
извиняюсь за тупость,можете написать передачу функции по ссылке пример
|
|
|
Записан
|
|
|
|
McZim
|
|
« Ответ #24 : 02-06-2008 19:16 » |
|
alliance, ээээ может передачу в функцию по ссылке?
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #25 : 02-06-2008 19:19 » |
|
alliance, легко int Array[10]; f(Array,10); ... f(int*& array, int nLen) { array[7]=...; } найди 1 отличие
|
|
|
Записан
|
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #26 : 02-06-2008 19:34 » |
|
хм а ечли убрать знак амперсанта это ведь будет передача по ссылке ?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
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
Постоялец
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
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #29 : 02-06-2008 19:52 » |
|
Ты передаеш указатель на строго типизированную переменную. Кстати, вот на такое некоторые компиляторы будут брыкаться. По крайней мере я встречал такое поведение. По стандарту, массивы не передаются как параметр функции. Компилятор сам автоматически подменяет на указатель в массив.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
|