0 / 0 / 0
Регистрация: 29.11.2011
Сообщений: 13

Передача по ссылке или указателю?

15.02.2013, 17:26. Показов 3549. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В каких случаях лучше передавать в функцию ссылки, а в каких указатели?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.02.2013, 17:26
Ответы с готовыми решениями:

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

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

Передача параметров в функцию по значению, по ссылке или по указателю
Передача параметров в функцию по значению, по ссылке или по указателю. Чем отличаются эти 3 способа. И, если не сложно, привести...

26
Эксперт С++
 Аватар для Avazart
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.02.2013, 17:30
Лучше по ссылки...

Но тут высказывают другое мнение Подскажите использование char** на примере
0
178 / 161 / 38
Регистрация: 08.10.2012
Сообщений: 423
15.02.2013, 18:28
Цитата Сообщение от Avazart Посмотреть сообщение
Лучше по ссылки...
Указатели же то же не просто так придумали =)
Достаточно хорошо всё рассказано
От себя добавлю, хотя скорее всего это и не так.
В общем я указатели отправляю для того чтобы изменить выделяемую им память
типо такого

C++
1
2
3
4
void F(int *p){
    p=new int[5];
    delete[] p;
}
0
Эксперт С++
 Аватар для Avazart
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.02.2013, 18:32
Цитата Сообщение от MrGrig Посмотреть сообщение
Указатели же то же не просто так придумали =)
Указатели придумали еще в Си... в С++ придумали ссылки...
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
15.02.2013, 18:32
Цитата Сообщение от MrGrig Посмотреть сообщение
C++
1
2
3
4
void F(int *p){
    p=new int[5];
    delete[] p;
}
А зачем тут вообще передавать это p в функцию, если оно не используется?
0
Эксперт С++
 Аватар для Avazart
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.02.2013, 18:33
C++
1
2
3
4
void F(int *p){
    p=new int[5];
    delete[] p;
}

А зачем там указатель в аргументах ?
C++
1
2
3
4
5
void F()
{
    int* p=new int[5];
    delete[] p;
}
0
178 / 161 / 38
Регистрация: 08.10.2012
Сообщений: 423
15.02.2013, 19:48
Цитата Сообщение от Somebody Посмотреть сообщение
А зачем тут вообще передавать это p в функцию, если оно не используется?
Цитата Сообщение от Avazart Посмотреть сообщение
А зачем там указатель в аргументах ?
C++
1
2
3
4
5
void F()
{
    int* p=new int[5];
    delete[] p;
}
сказал же для примера =/
вот еще один пример

C++
1
2
3
4
5
6
class tree{
    int key;
    int data;
    tree *left, *right;
    //конструкторы, деструктор, методы, другие поля и т.д.
};
обычно делают рекурсивную функцию поиска вставки по ключу add(tree *p,int key,int data);
и когда нашли вызывают создание нового листка
C++
1
2
3
4
5
6
7
addnew(tree *p,int key,int data){
    tree buf=new tree;
    buf->left=buf->right=NULL;
    buf->key=key;
    buf->data=data;
    p=buf;
}
Добавлено через 33 секунды
это я про то что если в синтаксисе языка есть указатели, значит не просто так.
0
Эксперт С++
 Аватар для Avazart
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.02.2013, 20:06
Зачем делать ф-цию если можно сделать класс и его метод... и без указателей...
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
15.02.2013, 20:37
Цитата Сообщение от Pravednik Посмотреть сообщение
В каких случаях лучше передавать в функцию ссылки, а в каких указатели?
Ссылка - это псевдоним для уже существующей переменной. Таким образом, если к моменту вызова такая переменная (именованная область памяти) у вас уже есть, то синтаксически удобнее и безопаснее использовать ссылку (под капотом - это тот же указатель).

Указатель опаснее тем, что может указывать на несуществующую область памяти (еще не выделенную или уже освобожденную), но этим же и удобнее, если вы не забываете проверять и обрабатывать условие == NULL.

Думаю, можно руководствоваться правилом: где возможно и логично (не требуется создавать фиктивные объекты) использовать ссылки, где нельзя (для изначально не существующих объектов) - указатели.

Ставьте во главу угла не религиозный фанатизм "Refs vs Ptrs", а удобство написания, чтения и сопровождения кода.

Востребованные программы живут неожиданно долго. Ну, кто из программистов на Cobol-60 задумывался о проблеме Year2000 :-)
2
0 / 0 / 0
Регистрация: 29.11.2011
Сообщений: 13
15.02.2013, 23:21  [ТС]
я не пойму зачем вообще ссылка нужна, если ее можно заменить константным указателем типа int* const a = &b
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
15.02.2013, 23:50
Цитата Сообщение от Pravednik Посмотреть сообщение
я не пойму зачем вообще ссылка нужна
затем что она не может быть нулем
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.02.2013, 01:09
Цитата Сообщение от Pravednik Посмотреть сообщение
я не пойму зачем вообще ссылка нужна, если ее можно заменить константным указателем типа int* const a = &b
Ссылками, чаще всего объявляют формальные параметры функций, если нужно передать не копию, а адрес, то есть изменить значение. Тогда передавать можно прямо, имя переменной этого типа, ничего больше не делая. То есть ссылку в коде, перед вызовом создавать не нужно (хотя при желании и это можно ). В теле же функции, не требуется никаких разыменований и это легко читаемо и компактно.
Время от времени и довольно регулярно, возникают споры о том, что дескать, "если не обратить внимание" на объявление функции, можно получить не то, что ожидал и пр. Потому как код не отличается от кода функции с аргументом - значение. Но это же вещи, на которые нельзя не обратить внимание.
В общем, вопрос сугубо индивидуальный.
1
 Аватар для Kuzia domovenok
4265 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,528
Записей в блоге: 1
16.02.2013, 01:23
Цитата Сообщение от Avazart Посмотреть сообщение
Указатели придумали еще в Си... в С++ придумали ссылки...
Ну так именно! Наконец то и ты и все начинают понимать, что лучше придерживаться стиля Си

Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
затем что она не может быть нулем
она много чем не может быть и это создаёт кучу проблем. Например, я не знаю способа перенаправить ссылку с одного объекта на другой.
Не могу проинициализировать её нулём и провести инициализацию после объявления.
Область применения ссылок практически полностью (ИМХО) ограничена передачами в/из функций.
0
Эксперт С++
 Аватар для Avazart
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.02.2013, 01:33
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
я не знаю способа перенаправить ссылку с одного объекта на другой.
О_о по этой фразе сразу видно в ++, с сишными замашками ...

Добавлено через 43 секунды
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Область применения ссылок практически полностью (ИМХО) ограничена передачами в/из функций.
Наконец-то вы это поняли...
0
 Аватар для Kuzia domovenok
4265 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,528
Записей в блоге: 1
16.02.2013, 01:44
Цитата Сообщение от Avazart Посмотреть сообщение
О_о по этой фразе сразу видно в ++, с сишными замашками ...
Так ты знаешь способ?
Кстати("перенаправить ссылку с одного объекта на другой."), вполне себе объектно-ориентированная задача. И в плюсах встречается не реже, чем в Сях.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
16.02.2013, 02:59
Цитата Сообщение от Pravednik Посмотреть сообщение
я не пойму зачем вообще ссылка нужна, если ее можно заменить константным указателем типа int* const a = &b
Попробуй повторить это без использования ссылок
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
class String
{
public:
    //...
    String(const char* s);
    String& operator = (const String& rhs); // 1
    char& operator [] (int idx);            // 2
    //...
};
 
//...
 
String operator + (const String& lhs, const String& rhs); // 3
void writeLn(const String& sc);                           // 4
 
//...
 
int main()
{
    String s1 = "s1";
    String s2 = "s2";
 
    s1 = s2;     // 1
    s1[0] = 'a'; // 2
 
    s2 = s1 + "123"; // 3
 
    writeLn(s1);        // 4
    writeLn("abc");     // 4
}
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.02.2013, 03:12
И это, наверное, нельзя по-другому:
C++
1
2
3
4
5
6
class Sting{
//-------------------------------
public:
Sting(const Sting& song);
//-------------------------------
};
Но раз вопрос вообще о ссылках и указателях, то проще без ООП может?
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.02.2013, 03:13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Кстати("перенаправить ссылку с одного объекта на другой."), вполне себе объектно-ориентированная задача. И в плюсах встречается не реже, чем в Сях.
С учётом того, что это противоречит определению самой ссылки в с++ (она не равнозначна ссылке в java или c#) - конечно часто встречается
0
 Аватар для Kuzia domovenok
4265 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,528
Записей в блоге: 1
16.02.2013, 04:14
Цитата Сообщение от alex_x_x Посмотреть сообщение
С учётом того, что это противоречит определению самой ссылки в с++ (она не равнозначна ссылке в java или c#) - конечно часто встречается
Что значит противоречит? указатель я могу в любое время перенаправить с одного объекта на другой, или разрушить ранее хранимый по указателю объект и построить новый. Пример привести что ли?
Ссылки думаешь позволят это???
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
16.02.2013, 04:42
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
указатель я могу в любое время перенаправить с одного объекта на другой, или разрушить ранее хранимый по указателю объект и построить новый. Пример привести что ли?
Реальный пример когда это необходимо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.02.2013, 04:42
Помогаю со студенческими работами здесь

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

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

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

Почему передача по ссылке не работает, только по указателю?
#include <iostream> #include<windows.h> #include<ctime> using namespace std; void input(int*,int); int main() { ...

Передача параметров функции по значению, ссылке и указателю
Вычислить 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Непрерывная интеграция для пакета Python
Mr. Docker 22.06.2025
Было 4 часа утра пятницы, когда я выпустил новую версию нашей внутренней библиотеки для обработки данных. Релиз 0. 5. 2 содержал небольшой фикс для обработки дат в ISO формате, что может пойти не так?. . .
Продвинутый ETL на C# из OLTP БД в хранилище
stackOverflow 22.06.2025
Работая в сфере корпоративной аналитики, я постоянно сталкиваюсь с одним и тем же - нужны чистые, структурированные и, главное, свежие данные. Без них современные аналитические системы, машинное. . .
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru