Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774

Почему передача по ссылке не работает, только по указателю?

05.08.2015, 21:16. Показов 6418. Ответов 102
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include<windows.h>
#include<ctime>
using namespace std;
void input(int*,int);
int main()
{
srand(time(0));
const int n=10;
int arr[n];
input(arr,n);
return 0;
}
void input(int arr[],int k){
    for(int i=0;i<k;i++){
    arr[i]=rand()%2;
    cout<<" "<<arr[i];
}
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.08.2015, 21:16
Ответы с готовыми решениями:

Передача по указателю и по ссылке
Всем привет! Есть функция, в которую передается ссылка: void Compare(int &amp;p) { int * str = p;// здесь ошибка нельзя...

Передача по ссылке или указателю?
В каких случаях лучше передавать в функцию ссылки, а в каких указатели?

Передача по ссылке или по указателю
Класс А здесь минимальный в реальности у него много переменных. Как лучше поступить в таком случае? Удобнее выпольнить передачу по ссылке,...

102
06.08.2015, 20:59
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
двухмерные массивы и есть "один блок памяти".
и казалось бы, причем тут ссылки?
- когда ты вделяешь нью для строки память аллоцируется для этой строки совсем в другом месте чем предыдущая
hoggy, правда считаешь что стркои будут лежать по порядку в одном блоке
C++
1
2
3
int ** arr = new int*[5];
for( int i = 0; i < 5; i++ )
      arr[i] = new int[8];
?


hoggy, вот код чтобы снять дискуссию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iomanip>
#include <iostream>
using namespace std;
 
int main(){
    int ** arr = new int*[5];
    for( int i = 0; i < 5; i++ ){
      arr[i] = new int[8];
      cout<<hex<<arr[i]<<endl;
    }
 
    return 0;
}
http://codepad.org/6L01ZOJ8
0x9985470
0x99855b8
0x99855f8
0x9985638
0x9985678

0
06.08.2015, 21:11

Не по теме:

ОгУрЕц, в твоем коде нет двумерных массивов. У тебя сначала выделяется память для одномерного массива указателей, а потом в него записываются значения адресов одномерных же массивов double. Это эмуляция двумерного массива. Вот, собственно, на эту тему уже было очень подробное объяснение: Работа с двухмерным динамеческим массивом через указатель, интересное начинается с 11 сообщения.

0
06.08.2015, 21:15

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
в твоем коде нет двумерных массивов.
Немного отходя от темы, что по вашему есть двумерный массив?

0
06.08.2015, 21:31

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
Немного отходя от темы, что по вашему есть двумерный массив?
Любой массив - это непрерывнй блок памяти, согласно стандарту С++.
An object of array type contains a contiguously allocated non-empty set of N subobjects of type T.
Следовательно, двумерный массив с точки зрения языка С++ - это такой массив, где T (тип элемента) тоже является массивом. Отсюда следует, что языковые многомерные массивы, т.е. массивы, которые поддерживаются типизацией языка С++, всегда непрерывны в памяти.
А вот то, что выше привели, в пример языковым массивом не является, хотя обладает той же семантикой. Т.е. это многомерный массив только по поведению, но не по сути.
Об этом как раз TheCalligrapher в той теме говорил, не смотря на жесткое непонимание и троллинг со стороны оппонента.

0
06.08.2015, 21:34

Не по теме:

мой вопрос вроде немного иначе звучал.

0
06.08.2015, 21:36

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
мой вопрос вроде немного иначе звучал.
Мое понимание совпадает с определением, которое дается в стандарте, п. 8.3.4.
Если я все еще не ответил на твой вопрос, то предлагаю его перефразировать, а то я пока что не вижу что еще можно добавить здесь.

0
Заблокирован
06.08.2015, 21:47
DrOffset, в моём коде из поста 61 динамический двумерный массив, мне интересно вы знаете иные способы его задания?Я лично нет.

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Любой массив - это непрерывнй блок памяти, согласно стандарту С++.
- а кто сказал что страйпы на которые указывает каждый элемент массива указателей прерывны?Я не говорил. Я говорил, что концептуально верно эмулировать двумерный массив, через одномерный выделив память в едином блоке, с показанным мною ранее доступом к страйпам
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
int * MyMatrix::operator[](size_t row){
* * * return ptr + n_in_row*row;
}
int p = matrix[y][x];
- у вас есть к этому замечания?Поясните вашу позицию.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.08.2015, 22:00
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
в моём коде из поста 61 динамический двумерный массив
В посте 61 - эмуляция двумерного массива посредством массива указателей. Массив указателей - это не двумерный массив - это массив указателей. Разница в типизации.
Еще раз повторюсь, любой массив в терминологии С++ непрерывен. Вот приведу еще раз цитату из спецификации языка, раз не хотите читать ссылку.
An object of array type contains a contiguously allocated non-empty set of N subobjects of type T
В многомерных массивах все тоже самое, но типом элемента являются другие массивы. Непрерывность не пропадает. Товарищ Hoggy знает это, поэтому сказал
двухмерные массивы и есть "один блок памяти".
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
мне интересно вы знаете иные способы его задания
Да.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iomanip>
#include <iostream>
using namespace std;
 
int main()
{
    int (*arr)[8] = new int[5][8];
    for( int i = 0; i < 5; i++ ){
      cout<<hex<< &arr[i]<<endl;
    }
    delete [] arr;
}
http://rextester.com/MCGBV32496
Вот это настоящий двумерный массив, выделенный в динамической памяти. И память его непрерывна.

Добавлено через 2 минуты
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
у вас есть к этому замечания?Поясните вашу позицию.
ОгУрЕц, у меня замечания только по форме. Когда Hoggy говорит о непрерывности многомерных массивов, он имеет в виду массивы языка С++, а не эмуляцию их в runtime. Вот и все. Поэтому возражать на его цитату о языковых массивах кодом с эмуляцией - не совсем справедливо.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.08.2015, 22:08
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот это настоящий двумерный массив, выделенный в динамической памяти.
Кхм.. по стандарту языка это не двумерный массив.
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.08.2015, 22:15
Цитата Сообщение от castaway Посмотреть сообщение
Кхм.. по стандарту языка это не двумерный массив.
Аргументы?

Я пока свои приведу:
5.3.4:
The new-expression attempts to create an object of the type-id (8.1) or new-type-id to which it is applied.
type-id в данном случае это int[5][8]
int[5][8] - это тип массива. Значит new в данном случае создает объект типа int[5][8] то есть multidimensional array c размерностями 5 и 8, проще говоря - двумерный массив.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.08.2015, 22:29
Цитата Сообщение от DrOffset Посмотреть сообщение
Аргументы?
8.3.4.3 When several “array of” specifications are adjacent, a multidimensional array is created;
Только это в стандарте определяет многомерный массив. Другого не вижу.
Цитата Сообщение от DrOffset Посмотреть сообщение
Следовательно
Цитата Сообщение от DrOffset Посмотреть сообщение
Значит
Если уж и следовать стандарту, то до конца. Я в нём не заметил никаких "Следовательно" и "Значит".
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.08.2015, 22:35
Цитата Сообщение от castaway Посмотреть сообщение
Только это в стандарте определяет многомерный массив.
When several “array of” specifications are adjacent, a multidimensional array is created;
Ну и? Разве в записи
C++
1
int [5][8]
нет этого
several “array of” specifications are adjacent
?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.08.2015, 22:40
В этой записи:
C++
1
int (*arr)[8]
нет этого.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.08.2015, 22:42
Цитата Сообщение от castaway Посмотреть сообщение
В этой записи нет этого.
Конечно нет, это ведь не массив. Это указатель на массив.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 22:46
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
- когда ты вделяешь нью для строки память аллоцируется для этой строки совсем в другом месте чем предыдущая
hoggy, правда считаешь что стркои будут лежать по порядку в одном блоке
когда я выделяю память по нью,
я правда не считаю это массивом.

потому что осознаю разницу между "массивом языка с++",
и "блоком памяти, выделяемом в куче".
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.08.2015, 22:46
Цитата Сообщение от DrOffset Посмотреть сообщение
Конечно нет, это ведь не массив. Это указатель на массив.
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот это настоящий двумерный массив
Пожалуй на этом и закончим.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 22:47
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
динамический двумерный массив
на языке с++ не существует "динамических массивов"
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.08.2015, 22:54
Цитата Сообщение от castaway Посмотреть сообщение
Пожалуй на этом и закончим.
Ты не прав. При чем тут указатель-то? Речь ведь о new.

Еще раз
The new-expression attempts to create an object of the type-id (8.1) or new-type-id to which it is applied.
Дословно: выражение new делает попытку создания объекта типа type_id или new-type-id
Естественно у объекта такого нет имени. А при возврате массив по правилам языка приводится к указателю. Что-то здесь новое я сказал? Ты должен это знать, я не верю, что ты этого не знаешь.
0
Заблокирован
06.08.2015, 22:55
Цитата Сообщение от hoggy Посмотреть сообщение
на языке с++ не существует "динамических массивов"
- Святые угодники, я не хочу продолжать беседу дальше https://ru.wikipedia.org/wiki/Динамический_массив
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
06.08.2015, 22:57
Цитата Сообщение от hoggy Посмотреть сообщение
на языке с++ не существует "динамических массивов"
разве std::vector нельзя назвать динамическим массивом ? Хогги у вас какой-то персональный подход к языку - бросьте вы это заучивание гуманитарно-технической лексики
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.08.2015, 22:57

Передача аргументов в функцию по ссылке и указателю
Чем отличается передача по ссылке от передачи по указателю аргументов в функцию?

Передача в функцию по ссылке или указателю
Гуру C++, как предпочтительнее делать?:) void f1(int &amp;a) { a = 5; } void f2(int * a) {

Передача std::vector в конструктор[по ссылке\указателю ?]
Доброго времени суток. Есть такой интерфейс класса: class HH_model_class { private: std::vector&lt;double&gt; parameters; ...

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

Передача параметров функции по значению, ссылке и указателю
Вычислить F=f(a)-5f^3(sin(b/2))+1/f(1+c^4), де f(x)=3x^2-2x^2+7, при a=5.08, b=-0.65, c=3.87 Добавлено через 45 минут #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru