Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774

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

05.08.2015, 21:16. Показов 6684. Ответов 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
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
06.08.2015, 09:16  [ТС]
Студворк — интернет-сервис помощи студентам
hoggy, Доброе утро, посоветуйте что почитать на эту тему. Я совсем запуталсо (

Добавлено через 3 минуты
hoggy, и вот вчера предложили вот такой вариант. У меня не компилируется. Выдает ошибку в строке for(auto&& i: a). Как раз то чего я меньше всего понимаю.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include<ctime>
using namespace std;
 
template<typename T, size_t N>
void input(T (&a)[N])
{
    for(auto&& i: a)
        i = rand()%2,
        cout<<" "<<i;
    cout<<'\n';
}
 
int main()
{
    srand(time(0));
    
    int arr[10];
    
    input(arr);
}
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 11:22
Цитата Сообщение от anti-k Посмотреть сообщение
for(auto&& i: a)
замените на:

C++
1
for(T& i: a)
если не поможет - выбросьте на помойку ваш компилятор, и возьмите новый.

ну или замените на:


C++
1
2
3
for(size_t n = 0, n<N; ++n)
    a[n] = rand()%2,
    cout<<" "<<a[n];
1
9 / 9 / 0
Регистрация: 26.01.2015
Сообщений: 94
06.08.2015, 11:27
arr[10][2] == arr[12]
Что за бред, какие 12 если 20?
Советую вас заново прочитать про указатели и ссылки.
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
06.08.2015, 12:51  [ТС]
Licoze, Какую именно литературу советуете прочесть?
0
9 / 9 / 0
Регистрация: 26.01.2015
Сообщений: 94
06.08.2015, 13:23
anti-k, я не Вам, а "советчику" из 5 сообщения.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.08.2015, 13:32
Цитата Сообщение от Licoze Посмотреть сообщение
Что за бред, какие 12 если 20?
Мне почему то кажется что он имел в виду не размер в элементах, а то что элемент двумерного массива с индексами [10][2] соответствует элементу одномерного массива с индексом [12], если в двумерном массиве все данные расположены последовательно.
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
06.08.2015, 14:11  [ТС]
castaway, Здравствуйте!!!!! Мне по началу тоже показалось что так он вводит массив, но потом мой "черный ящик "сообразил что речь идет об элементе )).

Добавлено через 55 секунд
castaway, а может быть такое что данные в массиве расположены не последовательно? Наверное это когда массив заполняется "по частям" с возможными "пробелами". Прошу простить за делитантскую терминологию.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.08.2015, 14:23
Цитата Сообщение от anti-k Посмотреть сообщение
castaway, а может быть такое что данные в массиве расположены не последовательно?
В одномерном не может. В двумерном может (разрыв между строками).
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 14:41
Цитата Сообщение от anti-k Посмотреть сообщение
а может быть такое что данные в массиве расположены не последовательно?
нет, не может.
ни в одномерном, ни в двухмерном, ни в каком.
массив по определению - непрерывный блок памяти.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.08.2015, 14:48
anti-k, если представить динамически выделенную матрицу как двумерный массив то может. Если ты не рассматриваешь этот случай - то нет.
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
06.08.2015, 16:57  [ТС]
castaway,hoggy, а вот, допустим такой случай,
C++
1
2
3
4
5
const int n=10;
for(int i=0;i<3;i++)
arr[i]=0;
for(int i=6;i<n;i++)
arr[i]=1;
Разве это не будет не последовательным расположением? И если в случае я добавлю значения в пустые ячейки, в памяти оно так и будет сохранятся "рваными кусками"!?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.08.2015, 16:58
Не важно какими значениями заполнен массив, от этого он не становиться "разорванным".
1
9 / 9 / 0
Регистрация: 26.01.2015
Сообщений: 94
06.08.2015, 17:03
anti-k, в вашем примере arr даже не объявлен.Когда вы напишете int* arr=new int[10] вы уже выделите память на 10 ячеек, и не о какой рванности речи быть не может.
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
06.08.2015, 17:08  [ТС]
castaway, Licoze, Я почитал немного на эту тему, так вот на сколько я понял, двухмерный статический массив в памяти отображается как одномерный. Как можно описать это на практике, кодом?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.08.2015, 17:10
Цитата Сообщение от anti-k Посмотреть сообщение
двухмерный статический массив в памяти отображается как одномерный.
Всё верно.

Цитата Сообщение от anti-k Посмотреть сообщение
Как можно описать это на практике, кодом?
C++
1
int arr[10][20]; // в памяти представляет из себя неразрывный кусок памяти размером 10 * 20 * sizeof( int ) байт
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 17:16
Цитата Сообщение от anti-k Посмотреть сообщение
Разве это не будет не последовательным расположением? И если в случае я добавлю значения в пустые ячейки, в памяти оно так и будет сохранятся "рваными кусками"!?
кусок памяти у вас - непрерывный блок.
как именно вы будете его заполнять - ваши фантазии.

можете заполнить только начало и конец.
от этого непрерывный блок непрерывным быть не перестанет.

Цитата Сообщение от anti-k Посмотреть сообщение
Я почитал немного на эту тему, так вот на сколько я понял, двухмерный статический массив в памяти отображается как одномерный. Как можно описать это на практике, кодом?
например так:
http://rextester.com/YTKHR31829

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
using namespace std;
 
 
template<typename T, size_t Y, size_t X>
void view_matrix(const T (&a)[Y][X])
{
    cout<<"matrix["<<Y<<"]["<<X<<"] = {\n";
        for(size_t y=0; y<Y; ++y)
        {
            cout<<"    ";
            for(size_t x=0; x<X; ++x)
                cout<< a[y][x]<<", ";
            
            cout<<'\n';
        }
    cout<<"}\n";
}
 
template<typename T, size_t Y, size_t X>
void view_array(const T (&a)[Y][X])
{
    const auto ar = reinterpret_cast<const T(&)[Y*X]>(a);
    
    cout<<"array["<<Y*X<<"] = { ";
        for(size_t n=0; n<Y*X; ++n)
            cout<< ar[n]<<", ";
 
    cout<<"}\n";
}
 
 
int main()
{
    // двухмерный массив
    int matrix[3][2] = 
    { 
        {1,2}, 
        {3,4}, 
        {5,6} 
    } ;
         
    // показываем, как двухмерный
    view_matrix(matrix);
    
    // показываем, как одномерный
    view_array(matrix);
}
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
06.08.2015, 17:38  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
reinterpret_cast
хотя бы пару слов вот об этих моментах если можно,
Цитата Сообщение от hoggy Посмотреть сообщение
(&a)
интересно почему именно в круглых скобках, как то влияет на приоритет, или же это именно синтаксис касаемо контейнера!? Заранее пардонк за такие тупые вопросы
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 17:45
Цитата Сообщение от anti-k Посмотреть сообщение
хотя бы пару слов вот об этих моментах если можно,
reinterpret_cast означает "реинтерпретировать".

это указивка компилятору
воспринимать один тип данных, как другой:

C++
1
2
3
4
5
6
7
8
9
10
11
12
void view_array(const T (&a)[Y][X])
{
    // переменная а имеет тип const T (&a)[Y][X]
    // (ссылка на двухмерный массив)
    // а мы говорим компилятору, 
    // что хотим воспринимать её
    // как тип const T(&)[Y*X]
    // (ссылка на одномерный массив)
 
    const auto ar = reinterpret_cast<const T(&)[Y*X]>(a);
    ...
}
то есть на входе был двухмерный массив.
а мы сообщаем компилятору,
что хотим воспринимать его как одномерный.

поскольку двухмерный массив в памяти на самом деле располагается,
как одномерный, то подобное преобразование корректно.

Цитата Сообщение от anti-k Посмотреть сообщение
интерестно почему именно в круглых скобках, как то влияет на приоритет, или же это именно синтаксис касаемо шаблонов!?
синтаксис "ссылки на массив"
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
06.08.2015, 17:53  [ТС]
hoggy, Спасибо, а это ничего что мы реинтерпритируем константу?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 18:01
Цитата Сообщение от anti-k Посмотреть сообщение
Спасибо, а это ничего что мы реинтерпритируем константу?
было бы "чего" - компилятор стукнул бы по пальцам.

мы интерпритируем один неизменяемый тип данных на другой,
тоже не изменяемый.

константность объекта не нарушается.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.08.2015, 18:01

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

Передача в функцию по ссылке или указателю
Гуру 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...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru