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

Поиск:

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


Эксперт
****


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

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



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

Объявление переменной, инициализацию переменной и операцию присвоения smile 


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


Шустрый
*


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

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



Цитата(EgoBrain @ 7.11.2013,  03:08)
http://ru.m.wikipedia.org/wiki/Ссылка_(C%2B%2B)--вот там есть такой самой пример. Хотя применение двох значков *  *-как то непонятно причем они к &. Может *y-не может указывать на адрес, ибо &х-это взятия адреса хотя учебнике идется о новом типе даных ссылки. Ибо если буквально *y-бы указывал на адрес, то y-это был бы другой адрес, а я понимаю что y и &х-одно и это самое. Тогда возникает вопрос а если б8 выражение было бы y*=х-результат бы был этот самый тот самый, какой смысл тогда применять значок -&. Даже так если огласить y=&х-такой же результат должен быть?

http://ru.m.wikipedia.org/wiki/Ссылка_(C%2B%2B)--вот там есть такой самой пример. Хотя применение двох значков *  *-как то непонятно причем они к &. Может *y-не может указывать на адрес, ибо &х-это взятия адреса хотя учебнике идется о новом типе даных ссылки. Ибо если буквально *y-бы указывал на адрес, то y-это был бы другой адрес, а я понимаю что y и &х-одно и это самое. Тогда возникает вопрос а если б8 выражение было бы y*=х-результат бы был этот самый тот самый, какой смысл тогда применять значок -&. Даже так если огласить y=&х-такой же результат должен быть?
PM MAIL   Вверх
baldina
Дата 9.11.2013, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(maxi2 @  9.11.2013,  10:44 Найти цитируемый пост)
http://ru.m.wikipedia.org/wiki/Ссылка_(C%2B%2B)--вот

конгениально

maxi2, про указатели ты примерно понимаешь: y=&x означает поместить в y адрес х. *y означает значение по адресу y. при изменении *y изменяется х и наоборот.

теперь ссылки. это не указатели. объявляя ссылку y на переменную x 
Код

type& y = x;
 мы вводим как бы синоним переменной x. теперь можно обращаться к х или y с одинаковым результатом, обе переменные - одно и то же значение и поведение.
пусть амперсанд при объявлении ссылок тебя не смущает и не путает, в данном случае к адресам и ссылкам он  не относится.

теперь сложные выражения.
сначала пример - унарный минус y = -x
мы можем применить его дважды y = - -x // y=-(-x)
или трижды y = - - -x и т.д.
то же и с указателями.
если z это адрес не переменной, а указателя, то получить значение переменной можно двойной операцией разадресации
Код

int x = 123;
int *y = &x; // у указывает на (хранит адрес) х
int **z = &y; // z указывает на (хранит адрес) y
cout << **z; // выводит 123


теперь ссылки + указатели
тут все довольно просто: если y это ссылка на х, т.е. синоним, то операции с указателями на y суть операции с указателем на х.

когда встречается комбинация унарных выражений, её следует понимать, читая справа налево:
y = - - -x // -(-(-x))
y = *&x // *(&x), т.е. значение по адресу на которое указывает адрес х, т.е. значение х
**z; // *(*z), т.е. значение по адресу на которое указывает значение по адресу z
PM MAIL   Вверх
maxi2
Дата 9.11.2013, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хорошо последний пост еще прочитаю более внимательно, а то уже хвалили как ученика n-класа. Я вот обратился к запуску кода. Я спросил если написать *y=х-которое есть 5 то компилятор ругается и говорит что неправильный перевод типа от int до int*. Если написать y=(int*)x, то код компилируется но при исполнение зависает консоль? То что y=&х есть адресом одной переменной я уже дважды или трижды сам писал. Но тогда y*=х и если сделать перед выводом это присвоение то будет ошибка. Но *y= и х и адресу (или ссылки) х. Ибо если  напишу в си-аут то оно выводит &х=0х5565, и мы это значение присвояем *y которое равно в результате 5. Что по вашему эти две цифры одно и тоже? Пусть даже адрес идет 8ричной системд. Вы лутше поясните что выражение *y-не может указывать или равняться адресу а автоматически переходит на значение которое оно содержит?
PM MAIL   Вверх
maxi2
Дата 9.11.2013, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



То есть непонятно если а сперва присвояется 5244 а потом оно выходит равно 5 это трудно понять. Вот еще пример int *p=(int *)7; int* &q=p; q++; cout <<p<<q// 11  11-то есть если p-адрес Значение 7, а q-то же самое что p, а p=эквивалент &х-то здесь условно понятно. Просто думал что выражение *y=5 верно, а выходит надо приведение типов. И думал что *y=&х не имеет смысла. Ибо правая часть это взятие адреса а это ссылка то есть то же самое что написать &х=х-ведь есть же &y=х-но как компилятор разграничивает эти два понятие точнее взятие адреса и ссылку. То есть как самому это обозначить при написание кода?/ о том что это синоним я может не так прочитал ибо пример: флоат пи=3,14; &n=пи; где &n-не меняется вообще. 
PM MAIL   Вверх
akizelokro
Дата 9.11.2013, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Мир разнообразен. А симолический аппарат менее разнообрзаен. Поэтому для указателя и операции умножения используется примитивная звёздочка. А вот если бы ты пил почаще (иногда), ты бы с этим смирился


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
volatile
Дата 9.11.2013, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(maxi2 @  9.11.2013,  16:34 Найти цитируемый пост)
Просто думал что выражение *y=5 верно, а выходит надо приведение типов.

Код

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

maxi2, это две очено большие разницы.
Именно этого вы не понимаете. подумайте над этим.
И напишите словами что будет в перой строке, что во второй.

PM MAIL   Вверх
maxi2
Дата 9.11.2013, 20:10 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вы извините за повторение текста  и прочие, нет обычной клавы да и ПК, потому то что настрочил, потом надо закинуть сюда-потому и простыни текста.  Отвечая на вопрос скажу что если int a=5; то и a=5--если не так вы наведите результат. Вот там в примере если сперва предопределить х, а потом *y=(int*)х--то не работает, а *y=(int*)5-работает?
PM MAIL   Вверх
volatile
Дата 9.11.2013, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



maxi2, я задал простой вопрос, и жду простого ответа.
Вы видите разницу между 2-мя строками что я привел?


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


Шустрый
*


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

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



Это что по вашему какой то социологический опрос. В первом случае вы присваиваете целое значение по адресу y, а во втором случае извлекаете знчаение по адресу y, если вы это спрашиваете безотносительно примеров приведеных в этой теме, которые взяты из подраздела книги Новый тип Ссылка, которые менее более понял. Еще новое узнал, что *y=&x--это значение ячейки х. А не его адрес, а *y=х--вообще не компилируется без приведение типов: int *y=(int*)4, a int *y=(int*)x, если х уже определено--- нет.
PM MAIL   Вверх
baldina
Дата 9.11.2013, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



maxi2, вам просто пытаются помочь, только эффективность маловата...
Синтаксис вы неправильно понимаете.
В первом случае 
Цитата(volatile @  9.11.2013,  17:38 Найти цитируемый пост)
int *y = что-то;

нет присваивания по адресу. здесь объявление указателя и присваивание ему значения (адреса)
во втором
Цитата(volatile @  9.11.2013,  17:38 Найти цитируемый пост)
 *y = что-то;

не извлекается, а наоборот присваивается значение по адресу. если две строчки рассматривать вместе, то во второй значение присваивается тому, чей адрес присвоен y в первой.
PM MAIL   Вверх
feodorv
Дата 9.11.2013, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(maxi2 @  9.11.2013,  22:55 Найти цитируемый пост)
Это что по вашему какой то социологический опрос. 
Нет, конечно. Это лишь наводящий вопрос, призывающий Вас разобраться в 
Цитата(feodorv @  8.11.2013,  22:37 Найти цитируемый пост)
Объявление переменной, инициализацию переменной и операцию присвоения
Если Вы в этом не разберётесь, то никто за Вас не разберётся. 


Цитата(maxi2 @  9.11.2013,  22:55 Найти цитируемый пост)
В первом случае вы присваиваете целое значение по адресу y, а во втором случае извлекаете знчаение по адресу y

Абсолютно нет. Запись 
Код
int *y;
означает лишь объявление переменной с именем "y" и типом "указатель на int". Запись 
Код
int *y = &x;
означает лишь объявление переменной с именем "y" и типом "указатель на int" и инициализацию этой переменной (задание значения в момент объявления) адресом переменной x. Никакого присвоения целого значения по адресу y здесь нет и в помине.


А вот здесь как раз есть:
Цитата(volatile @  9.11.2013,  18:38 Найти цитируемый пост)
*y = что-то;
Здесь-то как раз присвоение целого значения по адресу y


Аналогичная ситуация с ссылками. Из-за непонимания этих простых истин и возникает всё Ваше недоумение.


Цитата(maxi2 @  9.11.2013,  22:55 Найти цитируемый пост)
Еще новое узнал, что *y=&x--это значение ячейки х.

Это не так.


Цитата(maxi2 @  9.11.2013,  22:55 Найти цитируемый пост)
а *y=х--вообще не компилируется без приведение типов

И не должно. Указателю можно присвоить только какой-нибудь адрес (например, значение другого указателя или результат операции взятия адреса), а не значение целой переменной. Когда вы пишете (int*)4, то превращаете целочисленное значение 4 в адрес. И опять возникает "социологический опрос":
Цитата(feodorv @  6.11.2013,  23:02 Найти цитируемый пост)
как по-Вашему, что такое адрес переменной в памяти процесса?
Что это - абстракция или какой-то значение с каким-то смыслом?



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


Шустрый
*


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

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



Да я неправильно понял ваш вопрос и вот хотел теперь посмотреть на форум и здогадался, что инт *г=&х, должна быть с амперсандом-ибо иначе ошибка компилятора. а *Г=х,это обычно присвоение. Но трудно понять почему в первом случае вы говорите что идет присвоение адреса, ибо тогда можно было написать г=&х. Потом в основном примере темы нету выражение *г=х, то есть присвоение гласно не гласно идет в первом случае *г=&х, когда как бы одновременно указывается что г=&х, а *г=х. Хотя непонятно что все таки в учебнике этот амперсанд значит-взятие адреса или ссылку. Ибо если последнее оно вроде в левой части в остальных примерах. Касательно приведение типов то я имел ввиду что код х=2; инт *г=(инт*)х-не исполняется но компилируется, а инт *г=(инт*)3-работает.
PM MAIL   Вверх
maxi2
Дата 10.11.2013, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вижу что замечаний нету. Теперь хочу перейти к теме использование ссылок в функциях. Вот здесь очень интересный пример очень похожый до выражение что мы использовали перед этим. То есть как бы  &х равно х, и хочется знать что будет если использовать без знака ссылки void fun (int &y) {y++;} ...main () {int x=1; fun (x); cout<<x<<endl; } //2- a если без знака ссылки-то было бы 1 или 2. Естли void fun (int *y) {(*y)++; } ... main () { int x=1; fun (&x); cout<<x<<...}//2.  В первом случае я так понимаю что это не знак взятия адреса а ссылка то есть ибо тогда в функцию бы передавалось не значение а адрес.то есть если проще это выражение типа-инт &y=х-вот уже по ходу понял как привязать декларацию и инициализацию функции. Во втором случае-уже заежженый вариант-инт *y=&х, с чего выплывает-*y=х.  А то если не приравнивать обьявиение и инициализацию снова ничего не понять.
PM MAIL   Вверх
bsa
Дата 10.11.2013, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(maxi2 @  10.11.2013,  20:26 Найти цитируемый пост)
Вижу что замечаний нету.
Замечаний нет не потому что их нет, а потому что их никто не оставил. А это могло быть по той причине, что никто не захотел с тобой связываться, или просто не читал.

Судя по способу твоего изложения своих мыслей и скорости восприятии информации можно сделать один вывод - ты или де*ил, или творческая личность. Но ни тот, ни другой не способен освоить С++.

Если же так хочется, то забудь о конструкции int *y = &x; используй вместо неё int *y; y = &x;
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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