![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
maxi2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 8.5.2012 Репутация: 1 Всего: 1 |
Для меня много чего в этом вопросе непонятно. Наведу пример с учебника. Есть функция мейн. И переменные: int х=6; int *y=&х; (*y)++; cout выводит что х=7 а *y=7; не понятно-почему изменилось х-значит ли это что указатель возле игрека как бы в цепляет х и соотвественно изменяет и х. То есть как бы присваивание идет слева направо а не наоборот как обычно и есть. Потом вторая операция где есть указатель и ссылка вообще не понятна. Если х это 5. Тогда &х=0х530-то есть его адрес. Почему тогда указатель y который приравнивается к этой ссылке равен просто х. Или это так есть в С-языке. А в С++ это и значит что х=&х это одно и тоже а последне значит что значение передается по ссылке а не по значению. Вот на уровне компилятора желательно бы обьяснить. Ибо в стандартном понимание для меня: y-это адрес; а *y-значение что находится в этой ячейке памяти.
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 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 нельзя назначить "псевдонимом" для другой переменной. Здесь я это все детально разжевал. |
|||
|
||||
maxi2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 8.5.2012 Репутация: 1 Всего: 1 |
На счет z у меня еще будет вопрос. Вообще в этом деле где то десяток таких вопрос в этой теме. Только ваше включение z может только заплутать понимание. Я вот не понимаю почему не написать просто *y=х если y:-адрес переменной х. Ибо адрес и самая переменная не может быть одним и тоже. Хотя если х=&х, то есть это значит что присваивание идет по ссылке то это обьясняет почему инкремент был и в y, и х. Ибо без ссылки такого небыло б. Или может я в понимание на что этот указатель указывает ошибаюсь. То есть значение *y-это и указатель на адрес и на само значение. Хотя это конечно не одно и тоже. Ибо y-это адрес х. Например в магазине ценник что хлеб стоит 10 руб., это указатель на то что цена такая, и то что цена равна этому значению. То есть понятие 'казывает' и 'равно' как бы тождественно. Потом если бы мы записали *y=х результат был бы неодинаков -6 и 7. [касательно выражение &z=х, то понятно что это ссылка. Буквально означающая что адрес z равен х. То есть как бы само значение z-неопределено, и может быть
Добавлено через 4 минуты и 55 секунд любым]-это мне понимае согласно пройденному в C без плюсов. Может в ооп-варианте это имеет другой смысл. Или если там на языке компилятора или транслятора это записано как аксиома то наверное так должно быть. Это не физика не математика, язык как той как другой искуственное явление. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
maxi2, у тебя какая-то путаница в голове.
Указатель - так называется ПЕРЕМЕННАЯ, которая хранит адрес. int *y; - это объявление переменной y типа "указатель на int". y = &x; - это операция присваивания переменной y адреса переменной x; (*y)++ - это увеличение значения переменной, на которую указывает y, на 1. Это тоже самое, что x++, только не явно. Если все перевести к ценникам на хлеб, то ценник - это переменная. А вот когда тебе дадут бумажку с надписью: "цена на хлеб находится в таблице1 на 10-й строке и 5-м столбце"; то эта бумажка будет называться "указатель", а надпись - "адресом". |
|||
|
||||
maxi2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 8.5.2012 Репутация: 1 Всего: 1 |
Вот видите вы сами написали что указатель y=&х. Например 100ая ячейка. В то время как значение на которое он указывает или Ячейка хранит *y=х. Например 1, или 9млн. Если мы изменим х, то и *y должен поменяться. То есть ячейкам памяти не поменялась. Понимаю что и правильно обратное если нет поправте: например *y=1; потом мы присвоили *y=99 так и Х поменялась. Здесь вроде не вопрос. Только вы я думаю не совсем верно пояснили адреса на ценнике. Ибо как раз где этот ценник находится-магазин, правый верхний угол витрины это его адрес, даже буквально. А значение на нем написано-это и значение на которое указывает указатель-*y. Так и в книгах рисуют. Да и сам ценник-его цвет и форма не интересует, как не интересует физический адрес ячейки памяти а ее электронный адрес.
|
|||
|
||||
maxi2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 8.5.2012 Репутация: 1 Всего: 1 |
Может действительно C и C++-в этом вопросе отличаются ибо в учебнике по плюсах написано новый тип даных ссылка. Учебник очень недавний. Например следующий случай: речь идет о целочисленных даных: х=11; int & y=х; y++ ; результат тот же х и y равно 12. Хотя значение ссылок на х и y не приведено в коментариях. То есть непонятно значение int & y точнее значок ссылки должен быть возле инт, возле y, посредине как здесь или это не имеет значение? То есть я понимаю здесь тип int& а если написать &y-это будет неправильно. Хотя недумаю что компилятор здесь все разберет. То есть в этом примере непонятно почему не можно было написать y=х-результат был бы этот самый после инкремента.
|
|||
|
||||
feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
+1 ![]() maxi2, как по-Вашему, что такое адрес переменной в памяти процесса?
А если написать
Как по-Вашему, какие типы у следующих переменных:
Это сообщение отредактировал(а) feodorv - 6.11.2013, 22:15 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
feodorv, ты жестокий.
![]() |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
bsa, есть немного
![]() -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
EgoBrain |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
x и есть *y, а ты их видимо как разные вещи воспринимаешь. Может лучше привести сравнения с файловой системой чем с хлебом и другими продуктами питания?
Что понимается под электронным адресом? Электронный адрес и есть физический в рамках программирования, это некий номер, который хранит указатель. А под "физическим" ты что, имел ввиду типа где располагаются транзисторы в чипе от левого верхнего угла? maxi2, имхо ты сам себя запутываешь, понимай так как объясняется, не надумывай свои вторые-третьи смыслы.. Касательно синтаксиса объявления ссылки: MSный компилятор пропускает все 3 варианта. Лично я бы посоветовал при объявлении и указателей и ссылок значки ставить у имени переменной, потому что объявления могут производится перечелением через оператор ","
Здесь z и k разного типа. Так понятнее будет
Касательно путаницы что, где и когда использовать симолы взятия адреса указания типа или обращения по адресу: в языке некоторые обсалютно разные вещи используют одинаковые символы "*" и "&". Вариантов несколько "обозначение типа" при объявлении или приведении и "операция" (взятие адреса, обращения по адресу, умножение, бинарное или логическое И). |
||||||
|
|||||||
maxi2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 8.5.2012 Репутация: 1 Всего: 1 |
Нет вернемся к первому примеру. Х=6; а *y=&х-то есть *y не равно х. То почему же и то увеличились на единицу. Или &х это не взятие адреса, а ссылка что компилятор ее понимает по своему. То есть по вашему и *y=&х и *y=х это одинаковые вещи? Ведь ссылка увеличивается на размер типа даных если в этом смысле понимать адрес х. // физ. адрес я образно имел ввиду координаты ячейки памяти что хранит это значение, то есть какой то триггер или что то вроде этого в микросхеме
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
maxi2, ты путаешь вещи.
|
|||
|
||||
maxi2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 8.5.2012 Репутация: 1 Всего: 1 |
Ну что я конкретно путаю. Зачем в этой пример вплутывать еще и z,u. Вы говорите таким манером: типа грузия это горная страна или страна кавказа. И для ее пояснение наводите пример что вот если приравнять непал и швейцарию то она будет ближе к последней. Не много ли неизвестных. Вот не успел отослать: То есть важно проанализировать даже первую строку. Если х-6. То адрес неопреден. Если *y-указывает на на адрес и он увеличивается на единицу то адрес должен увеличиватся на 4-тип int. Или может дело в том что *y не может указываеть адрес переменной потому он сразу указывает на переменную х. Даже если так важно так сказать определить природу указателя. Если а=b, то если а++, то это не значит что и b увеличилось. А вопрос очень прост: что &х и х имеют одно и тоже значение. То есть адрес и значение ячейки одно и тоже.
Добавлено через 4 минуты и 58 секунд Хотя надо ввести этот пример в компилятор-ну там два для C и C++-может и результаты разные будут. А потом воспринимать как есть. Хотя воспринимать без реального понимание. Это ничего не даст. |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
maxi2, bsa дал исчерпывающий ответ, к чему тут твои аналогии(которые, лично мне вообще, не понятны)?
Такое поведение возможно, если в переменную засунуть адрес оной, то будет так. Как правило, такие ситуации не случаются. P.S.maxi2, вместо написания простыней текста, без разделения на абзацы, ты бы лучше подольше подумал и сформулировал четкий вопрос. Так быстрее ответ получишь. |
|||
|
||||
bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Это разные вещи. Просто ты выдираешь из контекста. Операция инициализации переменной при ее объявлении отличается от присваивания синтаксисом. int *y = &x и *y = x - это разные операции. Первая инициализирует указатель адресом, вторая копирует содержимое x в переменную, на которую указывает y. На примере с квартирами: первая - это взять бумажку из пачки и написать на ней адрес квартиры x, а вторая взять все содержимое квартиры x и отправить в квартиру по адресу, написанному на бумажке y.
Все это я тебе написал в простом коде с комментариями. |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |