Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели и ссылки в C++: нюансы, ВНИМАНИЕ!!! Новичкам не читать! 
:(
    Опции темы
maxi2
Дата 10.11.2013, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 8.5.2012

Репутация: 1
Всего: 1



Ну-ну, я в ваш адрес могу эту букву и написать. Пусть вы и эксперт. То что вы не хотели связываться это ваше дело, только  на кой ... было это дискусию может быть бесполезную продолжать, и именно тогда когда может менее более разобрали по полкам. Если замечание есть-жду критики. Правда освоить c++ трудно именно через сабж этой темы. Особенно если делать это самому. Кроме того как и каждый язык-это искуственно- и это надо воспринимать как оно есть. Другие языки как раз не имеют такого синтаксиса, и это упрощает работу  и уменьшает ошибки. В том то и дело что в школе я разве програмирование не учил, ибо его не было, а если бы было то думаю в паскале указателей и ссылок нету.  
PM MAIL   Вверх
maxi2
Дата 10.11.2013, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 8.5.2012

Репутация: 1
Всего: 1



Цитата(maxi2 @ 10.11.2013,  20:47)
Ну-ну, я в ваш адрес могу эту букву и написать. Пусть вы и эксперт. То что вы не хотели связываться это ваше дело, только  на кой ... было это дискусию может быть бесполезную продолжать, и именно тогда когда может менее более разобрали по полкам. Если замечание есть-жду критики. Правда освоить c++ трудно именно через сабж этой темы. Особенно если делать это самому. Кроме того как и каждый язык-это искуственно- и это надо воспринимать как оно есть. Другие языки как раз не имеют такого синтаксиса, и это упрощает работу  и уменьшает ошибки. В том то и дело что в школе я разве програмирование не учил, ибо его не было, а если бы было то думаю в паскале указателей и ссылок нету.

Вот если во второй функции в обьявление есть указатель, а при инициализации идет ссылка которую можно поплутать с взятием адреса, то я и написал что нужно приравнивать. Ибо раньше такое встречалось и было непонятно. Если аргумент функции меняет тип то как это понять. Например есть у меня 3ья функция: по вашему что бы быть програмистом надо быть еще каким то прорицателеm. x=2; void fun(int &y=x) {y++;}... main fun (); -тогда х и y синонимы и равны 2// func(z) -z и y-синонимы-то есть уже зед увеличивается. В этом примере не так просто догадатся что в первом случае параметры функции будут-&y=х; а во втором-&y=z; вот последнее выражение понятно как солнце в ясний день.
PM MAIL   Вверх
ldir
Дата 10.11.2013, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 13.11.2012

Репутация: нет
Всего: 1



maxi2,  не хотелось влазить, но тем не менее спрошу. Вы пытаетесь людей знающих с++ как то на свой лад переучить?
PM MAIL   Вверх
maxi2
Дата 10.11.2013, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 8.5.2012

Репутация: 1
Всего: 1



Кстати меня так выправляли, но всетаки не выправили: то что в правой части это как раз взятие адреса, а в левой это ссылка: это поспешность в чтение материала. Так и в функции: в первой это адрес-а во второй-ссылка. я вас и спрашивал как компилятор отличает: вот по левой или правой части и отличает. Если бы были такие опытные это бы в два счета обьяснили. 
PM MAIL   Вверх
ldir
Дата 10.11.2013, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 13.11.2012

Репутация: нет
Всего: 1



maxi2, на мой взгляд, это вы в два счета должны были в книжках прочитать и понять, а не на форуме спрашивать
PM MAIL   Вверх
bsa
Дата 10.11.2013, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



maxi2, по правой части решение применяется только в стандарте С++11 при использовании типа auto. Но тебе еще о нем знать рано. Тип операции вычисляется для левой и правой частей независимо. И если типы несовместимы с операцией, то выдается ошибка.
Я тебе уже написал, что операция int *y = &x; выглядит как две:
1. объявление переменной y: int *y;
2. инициализация ее адресом переменной x: y = &x;

Просто не понимая таких простых вещей ты никогда не сможешь понять более сложных, например: int *y = &x, &z = n, *&q = y;
Еще раз вдумчиво перечитай то, что тебе писали тут ранее. Я тебе даже примеры приводил. Попробуй проанализировать каждую их строку.
И не надо пытаться догадаться как работает компилятор. Тебе на данном этапе это только помешает.

На будущее. Если в начале операции участвует тип вне скобок, то эта операция является объявлением переменной(ых).
Цитата(maxi2 @  10.11.2013,  21:47 Найти цитируемый пост)
В том то и дело что в школе я разве програмирование не учил, ибо его не было, а если бы было то думаю в паскале указателей и ссылок нету.
В паскале они есть. Другое дело, что для работы с указателем там много геморроя придумано. А ссылки только процедур/функций используются (var в списке параметров). Да и называется там все это иначе, на сколько я знаю.
Цитата(maxi2 @  10.11.2013,  22:36 Найти цитируемый пост)
 x=2; void fun(int &y=x) {y++;}
Во-первых, данный код, написанный вне тела функции вызовет ошибку (из-за x=2 - вне функций нельзя выполнять присваивание, как и другие операции, кроме объявлений типов, переменных и функций). Во-вторых, обычно, в качестве дефолтных значений параметров функций используют некие константы.

PM   Вверх
maxi2
Дата 10.11.2013, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 8.5.2012

Репутация: 1
Всего: 1



Я никого не хочу переучить. Если б я десятки или даже сотни часов приделил c++ то многое было понималось само собой. Вот очень интересный пример о ссылках функциях: и меня коуд блок почему выводит одинаковый результат тип ли это инт& или просто инт. int x=5; int& fun1(int y) { x+=y; return x;} void (у меня работает лиш int?) main () {cout<<fun1(2)<<endl; cout<<x<<endl;}//7     7-какой смысл такой функции ссылки если без амперсанда получается это самое.
PM MAIL   Вверх
bsa
Дата 10.11.2013, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



по стандарту, функция main() должна возвращать тип int. Все остальные варианты нестандарты и могут не поддерживаться.
Цитата(maxi2 @  10.11.2013,  23:18 Найти цитируемый пост)
какой смысл такой функции ссылки если без амперсанда получается это самое.
практически никакого. Эта функция меняет значение глобальной переменной и возвращает на нее сслыку. А глобальные переменные - это зло.
PM   Вверх
maxi2
Дата 10.11.2013, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 8.5.2012

Репутация: 1
Всего: 1



Смотрите если есть int q=3; то и q=3; я ишел по логике что если заменить q=*y-то ничего не поменяется. Я вам уже наверное пять раз писал что меня здесь раздражает: если int q равняется, указывает на адрес почему оно потом без типа инт уже равно значению что есть в этой ячейке. Ну пусть. Это можно взять за должное ибо законами физики или математики это не понять. Это так придумали. Если работает. Все хорошо. А насчет правой и левой части это так и есть ибо ссылка обьявляется &z=х, а не наоборот. Вы меня простите, но если бы записывали int *y=х, и это все воспринимали то ничего бы особо не изменилось и было бы логичнее.// что значит возвращает ссылку-это адрес или синоним. Она ведь возвращает значение х.
PM MAIL   Вверх
bsa
Дата 10.11.2013, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



maxi2, ну как тебе еще объяснить, что int *y; - это такой синтаксис языка объявления указателей. int *y = &x; это тоже самое, что int *y; y = &x;
Запись &z = x вообще недопустима. Ты присваиваешь адресу какое-то значение. А вот int &z = x; - это совсем другое. Это создание ссылки z типа int на переменную x. 
PM   Вверх
EgoBrain
Дата 11.11.2013, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



maxi2, зачем ты мне какую-то цитату приписываешь? Я такого не постил.

Цитата(maxi2 @  10.11.2013,  22:43 Найти цитируемый пост)
Я вам уже наверное пять раз писал что меня здесь раздражает

Может быть стоит отказаться от использования языка если он раздражает, и происходит оттаржение его норм и принципов?

Цитата(maxi2 @  10.11.2013,  22:43 Найти цитируемый пост)
 ссылка обьявляется &z=х

Ссылка так не объявляется.
Ссылка объявляется так:
Код

int &z = x;


PM MAIL ICQ Skype   Вверх
NoviceF
Дата 11.11.2013, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Код

int *y = что-то;
    *y = что-то;

я вот больше склоняюсь к варианту 

Код

int* y = что-то;
    *y = что-то;

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

Конечно, всё понятно и по контексту, но так, на мой взгляд, логически более стройно.. хотя и образует другую проблему вида

Код

int* y, z, x;


Но вроде гуру учат объявлять каждую переменную на новой строке, так что в собственном коде такой несогласованности вполне можно избегать.
PM MAIL   Вверх
baldina
Дата 11.11.2013, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(maxi2 @  10.11.2013,  21:43 Найти цитируемый пост)
а в левой это ссылка: это поспешность в чтение материала

Цитата(maxi2 @  10.11.2013,  21:43 Найти цитируемый пост)
Если бы были такие опытные это бы в два счета обьяснили

Цитата(maxi2 @  10.11.2013,  22:43 Найти цитируемый пост)
Это можно взять за должное ибо законами физики или математики это не понять

Выбегалло

Это сообщение отредактировал(а) baldina - 11.11.2013, 09:20
PM MAIL   Вверх
maxi2
Дата 11.11.2013, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 8.5.2012

Репутация: 1
Всего: 1



Последнее это наверное склонность к итальянским фамилиям. Я вот приведу пример откуда начиналось мое понимание указателей, и оно несколько не похоже на ту строку которую мы уже обсуждаем несколько дней.  int *mypointer; int first, second; mypoimter=&first; *mypointer=10; mypointer=&second; *mypointer=20;¥ c++ language tutorial (cplus.com)-stranica 66. Поясните все таки что значит возвращает ссылку. В одном из вышеприведеных вариантов и вообще. Например функция int& fun2(int &z) {z++; return z;} ...main () {int x=5; fun2(x); cout-x-10. Почему функция возращает 10. А не 6. Или надо воспринимать это как &fun2=х-а как левая часть десять то и х=10. Или наоборот. Ибо функция возвращает х. Какая то обратная зависимость? У меня прогерского мышление нету потому обьясните пожалуста-и для чего здесь пост-инкремент?  
PM MAIL   Вверх
volatile
Дата 11.11.2013, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(maxi2 @  11.11.2013,  16:48 Найти цитируемый пост)
cout-x-10.

cout - это объект ввода вывода, его нельзя складывать, отнимать и т.д.
Цитата(maxi2 @  11.11.2013,  16:48 Найти цитируемый пост)
У меня прогерского мышление нету 

Если нет мышления, то хотябы переписывать научитесь внимательно.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0953 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.