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

Поиск:

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


Шустрый
*


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

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



Для меня много чего в этом вопросе непонятно. Наведу пример с учебника. Есть функция мейн. И переменные: int х=6; int *y=&х; (*y)++; cout выводит что х=7 а *y=7; не понятно-почему изменилось х-значит ли это что указатель возле игрека как бы в цепляет х и соотвественно изменяет и х. То есть как бы присваивание идет слева направо а не наоборот как обычно и есть. Потом вторая операция где есть указатель и ссылка вообще не понятна. Если х это 5. Тогда &х=0х530-то есть его адрес. Почему тогда указатель y который приравнивается к этой ссылке равен просто х. Или это так есть в С-языке. А в С++ это и значит что х=&х это одно и тоже а последне значит что значение передается по ссылке а не по значению. Вот на уровне компилятора желательно бы обьяснить. Ибо в стандартном понимание для меня: y-это адрес; а *y-значение что находится в этой ячейке памяти.
PM MAIL   Вверх
bsa
Дата 6.11.2013, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



int x; - переменная типа int
int *y = &x; - указатель на переменную x
int &z = x; - ссылка на переменную x

по сути, z и y с точки зрения компилятора это одно и тоже - переменная хранящая какой-то адрес. Разница лишь в способах доступа. С точки зрения программиста y - это адрес переменой x, а z - это псевдоним переменной x. Значение y (т.е. адрес) можно в любой момент поменять, а вот z нельзя назначить "псевдонимом" для другой переменной.

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


Шустрый
*


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

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



На счет z у меня еще будет вопрос. Вообще в этом деле где то десяток таких вопрос в этой теме. Только ваше включение z может только заплутать понимание. Я вот не понимаю почему не написать просто *y=х если y:-адрес переменной х. Ибо адрес и самая переменная не может быть одним и тоже. Хотя если х=&х, то есть это значит что присваивание идет по ссылке то это обьясняет почему инкремент был и в y, и х. Ибо без ссылки такого небыло б. Или может я в понимание на что этот указатель указывает ошибаюсь. То есть значение *y-это и указатель на адрес и на само значение. Хотя это конечно не одно и тоже. Ибо y-это адрес х. Например в магазине ценник что хлеб стоит 10 руб., это указатель на то что цена такая, и то что цена равна этому значению. То есть понятие 'казывает' и 'равно' как бы тождественно. Потом если бы мы записали *y=х результат был бы неодинаков -6 и 7. [касательно выражение &z=х, то понятно что это ссылка. Буквально означающая что адрес z равен х. То есть как бы само значение z-неопределено, и может быть

Добавлено через 4 минуты и 55 секунд
любым]-это мне понимае согласно  пройденному в C без плюсов. Может в ооп-варианте это имеет другой смысл. Или если там на языке компилятора или транслятора это записано как аксиома то наверное так должно быть. Это не физика не математика, язык  как той как другой искуственное явление.
PM MAIL   Вверх
bsa
Дата 6.11.2013, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



maxi2, у тебя какая-то путаница в голове.
Указатель - так называется ПЕРЕМЕННАЯ, которая хранит адрес.
int *y; - это объявление переменной y типа "указатель на int".
y = &x; - это операция присваивания переменной y адреса переменной x;
(*y)++ - это увеличение значения переменной, на которую указывает y, на 1. Это тоже самое, что x++, только не явно.

Если все перевести к ценникам на хлеб, то ценник - это переменная. А вот когда тебе дадут бумажку с надписью: "цена на хлеб находится в таблице1 на 10-й строке и 5-м столбце"; то эта бумажка будет называться "указатель", а надпись - "адресом".
PM   Вверх
maxi2
Дата 6.11.2013, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот видите вы сами написали что  указатель y=&х. Например 100ая ячейка. В то время как значение на которое он указывает или Ячейка хранит *y=х. Например 1, или 9млн. Если мы изменим х, то и *y должен поменяться. То есть ячейкам памяти не поменялась. Понимаю что и правильно обратное если нет поправте: например *y=1; потом мы присвоили *y=99 так и Х поменялась. Здесь вроде не вопрос. Только вы я думаю не совсем верно пояснили адреса на ценнике. Ибо как раз где этот ценник находится-магазин, правый верхний угол витрины это его адрес, даже буквально. А значение на нем написано-это и значение на которое указывает указатель-*y. Так и в книгах  рисуют. Да и сам ценник-его цвет и форма не интересует, как не интересует физический адрес ячейки памяти а ее электронный адрес. 
PM MAIL   Вверх
maxi2
Дата 6.11.2013, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Может действительно C и C++-в этом вопросе отличаются ибо в учебнике по плюсах написано новый тип даных ссылка. Учебник очень недавний. Например следующий случай: речь идет о целочисленных даных: х=11; int & y=х; y++ ; результат тот же х и y равно 12. Хотя значение ссылок на х и y не приведено в коментариях. То есть непонятно значение int & y точнее значок ссылки должен быть возле инт, возле y, посредине как здесь или это не имеет значение? То есть я понимаю здесь тип int& а если написать &y-это будет неправильно. Хотя недумаю что компилятор здесь все разберет. То есть в этом примере непонятно почему не можно было написать y=х-результат был бы этот самый после инкремента.
PM MAIL   Вверх
feodorv
Дата 6.11.2013, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(bsa @  6.11.2013,  19:10 Найти цитируемый пост)
maxi2, у тебя какая-то путаница в голове.

+1 smile 


maxi2, как по-Вашему, что такое адрес переменной в памяти процесса?


Цитата(maxi2 @  6.11.2013,  21:35 Найти цитируемый пост)
То есть я понимаю здесь тип int& а если написать &y-это будет неправильно.

А если написать
Код
int&y=x;
будет это правильно?
Как по-Вашему, какие типы у следующих переменных:
Код
int& y=x,z;
int* s,t
???

Это сообщение отредактировал(а) feodorv - 6.11.2013, 22:15


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
bsa
Дата 6.11.2013, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



feodorv, ты жестокий.  smile 
PM   Вверх
feodorv
Дата 6.11.2013, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



bsa, есть немного  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
EgoBrain
Дата 7.11.2013, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(maxi2 @  6.11.2013,  20:18 Найти цитируемый пост)
Если мы изменим х, то и *y должен поменяться.

x и есть *y, а ты их видимо как разные вещи воспринимаешь.
Может лучше привести сравнения с файловой системой чем с хлебом и другими продуктами питания?

Цитата(maxi2 @  6.11.2013,  20:18 Найти цитируемый пост)
Да и сам ценник-его цвет и форма не интересует, как не интересует физический адрес ячейки памяти а ее электронный адрес.

Что понимается под электронным адресом? Электронный адрес и есть физический в рамках программирования, это некий номер, который хранит указатель.
А под "физическим" ты что, имел ввиду типа где располагаются транзисторы в чипе от левого верхнего угла?

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

Цитата(maxi2 @  6.11.2013,  20:35 Найти цитируемый пост)
Например следующий случай: речь идет о целочисленных даных: х=11; int & y=х; y++ ; результат тот же х и y равно 12. Хотя значение ссылок на х и y не приведено в коментариях. То есть непонятно значение int & y точнее значок ссылки должен быть возле инт, возле y, посредине как здесь или это не имеет значение? То есть я понимаю здесь тип int& а если написать &y-это будет неправильно. Хотя недумаю что компилятор здесь все разберет. То есть в этом примере непонятно почему не можно было написать y=х-результат был бы этот самый после инкремента. 

Касательно синтаксиса объявления ссылки: MSный компилятор пропускает все 3 варианта. Лично я бы посоветовал при объявлении и указателей и ссылок значки ставить у имени переменной, потому что объявления могут производится перечелением через оператор ","
Код

int& z, k;

Здесь z и k разного типа.
Так понятнее будет
Код

int &z, k;



Касательно путаницы что, где и когда использовать симолы взятия адреса указания типа или обращения по адресу:
 в языке некоторые обсалютно разные вещи используют одинаковые символы "*" и "&". Вариантов несколько "обозначение типа" при объявлении или приведении и "операция" (взятие адреса, обращения по адресу, умножение, бинарное или логическое И).
PM MAIL ICQ Skype   Вверх
maxi2
Дата 8.11.2013, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нет вернемся к первому примеру.  Х=6; а *y=&х-то есть *y не равно х. То почему же и то увеличились на единицу. Или &х это не взятие адреса, а ссылка что компилятор ее понимает по своему. То есть по вашему и *y=&х и *y=х это одинаковые вещи? Ведь ссылка увеличивается на размер типа даных если в этом смысле понимать адрес х.  // физ. адрес я образно имел ввиду координаты ячейки памяти что хранит это значение, то есть какой то триггер или что то вроде этого в микросхеме
PM MAIL   Вверх
bsa
Дата 8.11.2013, 12:16 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



maxi2, ты путаешь вещи.
Код
int x; //объявление переменной x типа int
int *z; //объявление переменной y типа указатель на int
int *y = &x; //объявление переменной y типа указатель на int и инициализация ее адресом переменной x
int &u = x; //создание ссылки u на переменную x
z = &u; //присваивание переменной z адреса переменной, на которую ссылается u (т.е. x)
x = 1; //присваивание переменной x значения 1 (x = 1)
(*y)++; //инкремент переменной, на которую указывает y - в данном случае x (x = 2)
++*z; //инкремент переменной, на которую указывает z - в данном случае x (x = 3)
u = 5; //присваивание переменной, на которую ссылается u, значения 5 (x = 5)

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


Шустрый
*


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

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



Ну что я конкретно путаю. Зачем в этой пример вплутывать еще и z,u. Вы говорите таким манером: типа грузия это горная страна или страна кавказа. И для ее пояснение наводите пример что вот если приравнять непал и швейцарию то она будет ближе к последней. Не много ли неизвестных. Вот не успел отослать: То есть важно проанализировать даже первую строку. Если х-6. То адрес неопреден. Если *y-указывает на на адрес и он увеличивается на единицу то адрес должен увеличиватся на 4-тип int. Или может дело в том что *y не может указываеть адрес переменной потому он сразу указывает на переменную х. Даже если так важно так сказать определить природу указателя. Если а=b, то если а++, то это не значит что и b увеличилось.  А вопрос очень прост: что &х и х имеют одно и тоже значение. То есть адрес и значение ячейки одно и тоже.

Добавлено через 4 минуты и 58 секунд
Хотя надо ввести этот пример в компилятор-ну там два для C и C++-может и результаты разные будут. А потом воспринимать как есть. Хотя воспринимать без реального понимание. Это ничего не даст.
PM MAIL   Вверх
vinter
Дата 8.11.2013, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



maxi2,  bsa дал исчерпывающий ответ, к чему тут твои аналогии(которые, лично мне вообще, не понятны)?
Цитата

что &х и х имеют одно и тоже значение

Такое поведение возможно, если в переменную засунуть адрес оной, то будет так. Как правило, такие ситуации не случаются. 

P.S.maxi2, вместо написания простыней текста, без разделения на абзацы, ты бы лучше подольше подумал и сформулировал четкий вопрос. Так быстрее ответ получишь.


--------------------
Мой блог
PM MAIL WWW   Вверх
bsa
Дата 8.11.2013, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(maxi2 @  8.11.2013,  13:36 Найти цитируемый пост)
Ну что я конкретно путаю.


Цитата(maxi2 @  8.11.2013,  13:07 Найти цитируемый пост)
Нет вернемся к первому примеру.  Х=6; а *y=&х-то есть *y не равно х.
*y - это есть x. не копия, не привязка. а именно x. Наглядный пример: y - это бумажка, на которой можно писать, x - это квартира, y  = &x - это написать на бумажке адрес квартиры, *y - это пойти по адресу, который написан на бумажке. В итоге, делая *y ты получаешь то же, что и делая x - попадаешь в квартиру.
Цитата(maxi2 @  8.11.2013,  13:07 Найти цитируемый пост)
Или &х это не взятие адреса, а ссылка что компилятор ее понимает по своему.
Это не ссылка, это взятие адреса. Т.е. если x - это квартира, то &x - это адрес квартиры.
Цитата(maxi2 @  8.11.2013,  13:07 Найти цитируемый пост)
То есть по вашему и *y=&х и *y=х это одинаковые вещи? 
Это разные вещи. Просто ты выдираешь из контекста. Операция инициализации переменной при ее объявлении отличается от присваивания синтаксисом. int *y = &x  и *y = x - это разные операции. Первая инициализирует указатель адресом, вторая копирует содержимое x в переменную, на которую указывает y. На примере с квартирами: первая - это взять бумажку из пачки и написать на ней адрес квартиры x, а вторая взять все содержимое квартиры x и отправить в квартиру по адресу, написанному на бумажке y.
Цитата(maxi2 @  8.11.2013,  13:07 Найти цитируемый пост)
Ведь ссылка увеличивается на размер типа даных если в этом смысле понимать адрес х.
Ссылка не увеличивается. Тут вообще ссылок нет. int &u - это ссылка, а int *y - это указатель. Когда ты делаешь *y ты получаешь переменную, на которую указывает указатель. Затем ты к этой переменной применяешь оператор ++ и вызываешь приращение. ТЫ НЕ МЕНЯЕШЬ УКАЗАТЕЛЬ, ТЫ МЕНЯЕШЬ ПЕРЕМЕННУЮ.

Все это я тебе написал в простом коде с комментариями.

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

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

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

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

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


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

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


 




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


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

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