![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Объявление переменной, инициализацию переменной и операцию присвоения ![]() -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
maxi2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 8.5.2012 Репутация: 1 Всего: 1 |
http://ru.m.wikipedia.org/wiki/Ссылка_(C%2B%2B)--вот там есть такой самой пример. Хотя применение двох значков * *-как то непонятно причем они к &. Может *y-не может указывать на адрес, ибо &х-это взятия адреса хотя учебнике идется о новом типе даных ссылки. Ибо если буквально *y-бы указывал на адрес, то y-это был бы другой адрес, а я понимаю что y и &х-одно и это самое. Тогда возникает вопрос а если б8 выражение было бы y*=х-результат бы был этот самый тот самый, какой смысл тогда применять значок -&. Даже так если огласить y=&х-такой же результат должен быть? |
|||
|
||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
конгениально maxi2, про указатели ты примерно понимаешь: y=&x означает поместить в y адрес х. *y означает значение по адресу y. при изменении *y изменяется х и наоборот. теперь ссылки. это не указатели. объявляя ссылку y на переменную x
пусть амперсанд при объявлении ссылок тебя не смущает и не путает, в данном случае к адресам и ссылкам он не относится. теперь сложные выражения. сначала пример - унарный минус y = -x мы можем применить его дважды y = - -x // y=-(-x) или трижды y = - - -x и т.д. то же и с указателями. если z это адрес не переменной, а указателя, то получить значение переменной можно двойной операцией разадресации
теперь ссылки + указатели тут все довольно просто: если y это ссылка на х, т.е. синоним, то операции с указателями на y суть операции с указателем на х. когда встречается комбинация унарных выражений, её следует понимать, читая справа налево: y = - - -x // -(-(-x)) y = *&x // *(&x), т.е. значение по адресу на которое указывает адрес х, т.е. значение х **z; // *(*z), т.е. значение по адресу на которое указывает значение по адресу z |
||||
|
|||||
maxi2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 8.5.2012 Репутация: 1 Всего: 1 |
Хорошо последний пост еще прочитаю более внимательно, а то уже хвалили как ученика n-класа. Я вот обратился к запуску кода. Я спросил если написать *y=х-которое есть 5 то компилятор ругается и говорит что неправильный перевод типа от int до int*. Если написать y=(int*)x, то код компилируется но при исполнение зависает консоль? То что y=&х есть адресом одной переменной я уже дважды или трижды сам писал. Но тогда y*=х и если сделать перед выводом это присвоение то будет ошибка. Но *y= и х и адресу (или ссылки) х. Ибо если напишу в си-аут то оно выводит &х=0х5565, и мы это значение присвояем *y которое равно в результате 5. Что по вашему эти две цифры одно и тоже? Пусть даже адрес идет 8ричной системд. Вы лутше поясните что выражение *y-не может указывать или равняться адресу а автоматически переходит на значение которое оно содержит?
|
|||
|
||||
maxi2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 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-не меняется вообще.
|
|||
|
||||
akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Мир разнообразен. А симолический аппарат менее разнообрзаен. Поэтому для указателя и операции умножения используется примитивная звёздочка. А вот если бы ты пил почаще (иногда), ты бы с этим смирился
-------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
maxi2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 8.5.2012 Репутация: 1 Всего: 1 |
Вы извините за повторение текста и прочие, нет обычной клавы да и ПК, потому то что настрочил, потом надо закинуть сюда-потому и простыни текста. Отвечая на вопрос скажу что если int a=5; то и a=5--если не так вы наведите результат. Вот там в примере если сперва предопределить х, а потом *y=(int*)х--то не работает, а *y=(int*)5-работает?
|
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
maxi2, я задал простой вопрос, и жду простого ответа.
Вы видите разницу между 2-мя строками что я привел? |
|||
|
||||
maxi2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 8.5.2012 Репутация: 1 Всего: 1 |
Это что по вашему какой то социологический опрос. В первом случае вы присваиваете целое значение по адресу y, а во втором случае извлекаете знчаение по адресу y, если вы это спрашиваете безотносительно примеров приведеных в этой теме, которые взяты из подраздела книги Новый тип Ссылка, которые менее более понял. Еще новое узнал, что *y=&x--это значение ячейки х. А не его адрес, а *y=х--вообще не компилируется без приведение типов: int *y=(int*)4, a int *y=(int*)x, если х уже определено--- нет.
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
maxi2, вам просто пытаются помочь, только эффективность маловата...
Синтаксис вы неправильно понимаете. В первом случае нет присваивания по адресу. здесь объявление указателя и присваивание ему значения (адреса) во втором не извлекается, а наоборот присваивается значение по адресу. если две строчки рассматривать вместе, то во второй значение присваивается тому, чей адрес присвоен y в первой. |
|||
|
||||
feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Нет, конечно. Это лишь наводящий вопрос, призывающий Вас разобраться в
Абсолютно нет. Запись
А вот здесь как раз есть:Здесь-то как раз присвоение целого значения по адресу y. Аналогичная ситуация с ссылками. Из-за непонимания этих простых истин и возникает всё Ваше недоумение. Это не так. И не должно. Указателю можно присвоить только какой-нибудь адрес (например, значение другого указателя или результат операции взятия адреса), а не значение целой переменной. Когда вы пишете (int*)4, то превращаете целочисленное значение 4 в адрес. И опять возникает "социологический опрос":Что это - абстракция или какой-то значение с каким-то смыслом? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
maxi2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 8.5.2012 Репутация: 1 Всего: 1 |
Да я неправильно понял ваш вопрос и вот хотел теперь посмотреть на форум и здогадался, что инт *г=&х, должна быть с амперсандом-ибо иначе ошибка компилятора. а *Г=х,это обычно присвоение. Но трудно понять почему в первом случае вы говорите что идет присвоение адреса, ибо тогда можно было написать г=&х. Потом в основном примере темы нету выражение *г=х, то есть присвоение гласно не гласно идет в первом случае *г=&х, когда как бы одновременно указывается что г=&х, а *г=х. Хотя непонятно что все таки в учебнике этот амперсанд значит-взятие адреса или ссылку. Ибо если последнее оно вроде в левой части в остальных примерах. Касательно приведение типов то я имел ввиду что код х=2; инт *г=(инт*)х-не исполняется но компилируется, а инт *г=(инт*)3-работает.
|
|||
|
||||
maxi2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 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=х. А то если не приравнивать обьявиение и инициализацию снова ничего не понять.
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Замечаний нет не потому что их нет, а потому что их никто не оставил. А это могло быть по той причине, что никто не захотел с тобой связываться, или просто не читал.
Судя по способу твоего изложения своих мыслей и скорости восприятии информации можно сделать один вывод - ты или де*ил, или творческая личность. Но ни тот, ни другой не способен освоить С++. Если же так хочется, то забудь о конструкции int *y = &x; используй вместо неё int *y; y = &x; |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |