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

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

05.08.2015, 21:16. Показов 6408. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
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 и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru