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

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

05.08.2015, 21:16. Показов 5251. Ответов 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
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
05.08.2015, 21:19
имя статического массива уже его адресс, и при передачи в функцию не создается его копия
1
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
05.08.2015, 21:22
anti-k, передача по ссылке массива, что ли? Ссылка - псевдоним для переменной, а при работе с массивом нужен указатель
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
05.08.2015, 21:27  [ТС]
rikimaru2013, Мне в самом деле тяжело даются эти указатели и ссылки. Посоветуйте что почитать на эту тему. И если можно обясните как дело обстоит с матрицей в таких случаях. Буду очень благодарен!!
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
05.08.2015, 21:33
в С++ нету матриц. Есть самописный класс матрица, есть многомерный массив (двухмерный). При обращанее к двухмерному массиву доступ к елементу происходит по правилу

C++
1
arr[x][y] = (*(arr + x) + y );
В случаи с статическим массивов память выделяется последовательно следовательно

C++
1
arr[10][2] == arr[12]
Для передачи массива двухмерного в функцию надо указать
C++
1
2
3
4
5
#define WIDTH 10
void f(int arr[][WIDTH])
{
 
}
1
Заблокирован
05.08.2015, 21:35
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

anti-k, если есть особая на то надобность можно передать и по ссылке, главное - чтобы бы программист понимал что делает с блоком памяти.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include    <ctime>
using namespace std;
void input(int &,int);
int main()
{
    srand(time(0));
    const int n=10;
    int arr[n];
    input(arr[0],n);
    return 0;
}
void input(int &ptr, int k){
    int * arr = &ptr;
    for(int i=0;i<k;i++)
        cout<<(arr[i]=rand()%2)<<" ";
    cout<<endl;
}
http://codepad.org/HKxj84V4
1 1 0 1 1 0 0 0 1 0
Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
arr[x][y] = (*(arr + x) + y );
- это неверно, т.к пропущенно число элементов в строке после х

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
05.08.2015, 21:39
в С++ нету матриц. Есть самописный класс матрица, есть многомерный массив (двухмерный). При обращанее к двухмерному массиву доступ к елементу происходит по правилу

C++
1
arr[x][y] = *(*(arr + x) + y );
В случаи с статическим массивов память выделяется последовательно следовательно

C++
1
arr[10][2] == arr[12]
Для передачи массива двухмерного в функцию надо указать
C++
1
2
3
4
5
#define WIDTH 10
void f(int arr[][WIDTH])
{
 
}
Почему именно так? Надо засомонить кого-то поумнее чем я дурень. Но моё опредение почему так: если не указать индекс второй компилятору, то при
C++
1
2
3
4
void f(int arr[][])
{
arr[4][1] // это *( *(arr + ????) + 1  ); 
}
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
05.08.2015, 21:40  [ТС]
ОгУрЕц, В том то и дело что я слабо понимаю. Не моли бы ли вы немного прокомментировать ваш код.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
05.08.2015, 21:41
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
это неверно, т.к пропущенно число элементов в строке после х
ну я бы тут уточнил - это ВЕРНО, но для статических массивов - компилятор строит разименование подругому. Надо засумонить умного человека, castaway, Вот!
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
05.08.2015, 21:46  [ТС]
rikimaru2013, Спасибо)) то есть в статическом двухмерном массиве при вызове функции обязательно нужно указать в параметрах его длину именно значением?

Добавлено через 2 минуты
rikimaru2013, А почему arr[10][2] == arr[12]? а не 20??
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
05.08.2015, 21:47
Цитата Сообщение от anti-k Посмотреть сообщение
rikimaru2013, А почему arr[10][2] == arr[12]? а не 20??
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
arr[x][y] = *(*(arr + x) + y );
тыц
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
05.08.2015, 21:48  [ТС]
rikimaru2013, ))) четенько )) Это просто заучить или как ?? ))
0
24 / 24 / 7
Регистрация: 25.04.2013
Сообщений: 195
05.08.2015, 21:49
Цитата Сообщение от anti-k Посмотреть сообщение
Мне в самом деле тяжело даются эти указатели и ссылки. Посоветуйте что почитать на эту тему.
нужно больше работать, писать программу и на ошибках учиться.
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
05.08.2015, 21:51  [ТС]
kuza84, Дело в том что нужно понимать как работать. Перечитал по Пратта и по Лафорэ, все равно туман((.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
05.08.2015, 21:51
Цитата Сообщение от anti-k Посмотреть сообщение
Это просто заучить или как ?? ))
Сейчас сам жду ответа стариков насчёт статических массивов почему он не подвергается общему правилу разименования многомерных массивов.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
05.08.2015, 21:52
В современном C++ массивы по ссылке передают примерно так:
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 <size_t N>
void input( int (&arr)[N], int k ) {
    for ( int i = 0; i < k; i++ ) {
        arr[i] = rand() % 2;
        cout << " " << arr[i];
    }
}
 
int main()
{
    srand( time( 0 ) );
    const int n = 10;
    int arr[n];
    input( arr, n );
    return 0;
}
2
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
05.08.2015, 21:55  [ТС]
rikimaru2013, В таком случае подскажите та же задача. Я отсортировал обычной вкладкой. Как решить через буль?
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
#include <iostream>
#include<windows.h>
#include<ctime>
using namespace std;
void input(int*,int);
void sort(int*,int);
int main()
{
srand(time(0));
const int n=10;
int arr[n];
input(arr,n);
cout<<endl;
sort(arr,n);
cout<<endl;
for(int i=0;i<n;i++){
    cout<<" "<<arr[i];
}
 
return 0;
}
void input(int arr[],int k){
    for(int i=0;i<k;i++){
    arr[i]=rand()%2;
    cout<<" "<<arr[i];
}
}
void sort(int arr[],int k){
    for(int i=1;i<k;i++){
    for(int j=i;j>0;j--){
        if(arr[j]<arr[j-1])
        swap(arr[j],arr[j-1]);
    }
 
}
cout<<endl;
}
Добавлено через 1 минуту
castaway, Здравствуйте, о вас писали все газеты )). Могли бы ли вы немного обьяснить этот момент int (&arr)[N] ??
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
05.08.2015, 22:00
Цитата Сообщение от ОгУрЕц Посмотреть сообщение
это неверно
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
ну я бы тут уточнил - это ВЕРНО
Вроде всё верно.
C++
1
*(*(a + x) + y)
Цитата Сообщение от anti-k Посмотреть сообщение
Могли бы ли вы немного обьяснить этот момент int (&arr)[N] ??
Это ссылка на массив из N элементов типа int. Или прояснить что-то другое?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
05.08.2015, 22:02
castaway,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
template <size_t N>
void input(int(&arr)[N])
{
    for(int i = 0; i < N; i++)
    {
        arr[i] = rand() % 2;
        cout << " " << arr[i];
    }
}
int main()
{
    int arr[5];
    input(arr);
}
Зачем k? ^^
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
05.08.2015, 22:02  [ТС]
castaway, а в случае с думерным массивом принцып тот же? и почему arr[10][2] == arr[12]? а не 20??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.08.2015, 22:02
Помогаю со студенческими работами здесь

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

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


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

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

Новые блоги и статьи
Blazor и контроллер сервопривода IoT Meadow Maple
Wired 11.07.2025
Я решил разобраться, как можно соединить современные веб-технологии с миром "железа". Интересная комбинация получилась из Blazor в качестве веб-интерфейса и микроконтроллера Meadow с его веб-сервером. . .
Генерация OpenQASM из кода Q#
EggHead 10.07.2025
Летом 2024-го я начал эксперименты с библиотекой Q# Bridge, и знаете что? Она оказалась просто находкой для тех, кто работает на стыке разных квантовых экосистем. Основная фишка этой библиотеки -. . .
Изучаем новый шаблон ИИ-чата .NET AI Chat Web App
stackOverflow 10.07.2025
В . NET появилось интересное обновление - новый шаблон ИИ-чата под названием . NET AI Chat Web App. Когда я впервые наткнулся на анонс этого шаблона, то сразу понял, что Microsoft наконец-то. . .
Результаты исследования от команды ARP (июль 2025 г.)
Programma_Boinc 10.07.2025
Результаты исследования от команды ARP (июль 2025 г. ) Африканский проект по дождям (ARP) World Community Grid снова запущен! Мы рады поделиться обновленной информацией о нашем прогрессе с осени. . .
Angular vs Svelte - что лучше?
Reangularity 09.07.2025
Сегодня рынок разделился на несколько четких категорий: тяжеловесы корпоративного уровня (Angular), гибкие универсалы (React), прогрессивные решения (Vue) и новая волна компилируемых фреймворков. . .
Code First и Database First в Entity Framework
UnmanagedCoder 09.07.2025
Entity Framework дает нам свободу выбора, предлагая как Code First, так и Database First подходы. Но эта свобода порождает вечный вопрос — какой подход выбрать? Entity Framework — это. . .
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
Руководство по структурам данных Python
AI_Generated 08.07.2025
Я отчетливо помню свои первые серьезные проекты на Python - я писал код, он работал, заказчики были относительно довольны. Но однажды мой наставник, взглянув на мою реализацию поиска по огромному. . .
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Programma_Boinc 08.07.2025
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах Опубликовано: 07. 07. 2025 Рубрика: Uncategorized Автор: AlexA Статья размещается на сайте с разрешения. . .
Раскрываем внутренние механики Android с помощью контекста и манифеста
mobDevWorks 07.07.2025
Каждый Android-разработчик сталкивается с Context и манифестом буквально в первый день работы. Но много ли мы задумываемся о том, что скрывается за этими обыденными элементами? Я, честно говоря,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru