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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ссылки.. прошу объяснить 
:(
    Опции темы
S.A.G.
Дата 7.5.2007, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Если мы пишем 
Код
int * a
, то, понятное дело, создаем указатель на int. Это можно прочитать как *a есть данные типа int. Но что такое 
Код
int &a
? Как его мммм принять?


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Daevaorn
Дата 7.5.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(S.A.G. @  7.5.2007,  22:59 Найти цитируемый пост)
Как его мммм принять?

а - есть данные типа int
PM MAIL WWW   Вверх
S.A.G.
Дата 7.5.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Цитата(Daevaorn @ 7.5.2007,  22:03)
Цитата(S.A.G. @  7.5.2007,  22:59 Найти цитируемый пост)
Как его мммм принять?

а - есть данные типа int

тогда в чем отличие от 
Код
int a
?


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Daevaorn
Дата 7.5.2007, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(S.A.G. @  8.5.2007,  00:17 Найти цитируемый пост)
тогда в чем отличие от 

в том, что это непосредственно переменная, а ссылка это всего лишь псевдоним для переменной. сама по себе ссылка бесполезна. она должна ссылаться на какую-то переменную, тогда она имеет смысл. Вот такой код не пройдет
Код

int& a;

а вот это уже лучше:
Код

int b = 777;
int& a = b;

PM MAIL WWW   Вверх
Xenon
Дата 7.5.2007, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



S.A.G., ну это переменная, там ссылка ... Или я не понимаю вопроса или ты ... smile


--------------------
user posted image  
PM MAIL   Вверх
Samotnik
Дата 7.5.2007, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



2 S.A.G.
Ну вобще  если не  говорить про пример

Цитата(S.A.G. @  7.5.2007,  21:59 Найти цитируемый пост)
int &a


То & - это операция "взятия адреса" Ну к примеру
Код

void main()
{
int x,y;
........
*ptr = 5;
ptr = &y;
....
}


Ну примерно так.   
Т.е. тута  созд указатель на ptr  и присваивается значение 5, а затем y присваивается адрес етого ptr 
Вроде просто все!!!!!!     smile 
PM MAIL   Вверх
sergejzr
Дата 7.5.2007, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



int a; тоже самое, что и int &a; Только ссылка удобнее, потому что её неинициализированную создать нельзя и все операции по переадресации компилер сделает сам. 
пример:
Код

int &a=3;
a=5;


Компилер переведёт в 
Код

int tmp=3;
int *a = &tmp;
*a=5;


Т.е. меньше знаков нам писать и код читабельнее.
А с вызовом функций ещё удобнее!
Код

int x=1;
inc(x);
//теперь х стал 2
int inc(int &a)
{
 a++;
}

Намного красивее и проще писать, нежели то, что из неё сделает компилятор:

Код

int x=1;
inc(&x);
//теперь х стал 2
int inc(int *a)
{
 *a++;
}




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
S.A.G.
Дата 8.5.2007, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Код
int & a = 5

Если бы не было амперсанда, то такая запись значила бы что a - переменная и имеет значение 5. Переменная имеет адрес в памяти по которому можно разместить данные заданного в описании типа. 
Цитата(Deavorn)
ссылка это всего лишь псевдоним для переменной

Что значит "псевдоним для переменной"? Что сделает компилятор в данном случае, встретив такую запись?

Это сообщение отредактировал(а) S.A.G. - 8.5.2007, 01:30


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
JackYF
Дата 8.5.2007, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(sergejzr @  7.5.2007,  23:48 Найти цитируемый пост)
int a; тоже самое, что и int &a

чего???


Цитата(sergejzr @  7.5.2007,  23:48 Найти цитируемый пост)
int &a=3;
a=5;

это вообще не скомпилится...

sergejzr, ссылка - это псевдоним переменной. Со всеми вытекающими. С обязательной инициализацией именем переменной, но уж никак не значением. Она не создает ничего в памяти, это заморочка компилятора, а для программиста читабельность кода может повысить...

Код

int a = 3;
int& b = a;
// теперь к а можно обращаться по имени а и по имени b



Цитата(sergejzr @  7.5.2007,  23:48 Найти цитируемый пост)
Т.е. меньше знаков нам писать и код читабельнее.
А с вызовом функций ещё удобнее!
Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
    
int x=1;
inc(x);
//теперь х стал 2
int inc(int &a)
{
 a++;
}

Намного красивее и проще писать, нежели то, что из неё сделает компилятор:

Выделить всёкод C++
1:
2:
3:
4:
5:
6:
7:
    
int x=1;
inc(&x);
//теперь х стал 2
int inc(int *a)
{
 *a++;
}

тут все верно, но это передача по ссылке, это немного другое...

Добавлено через 2 минуты и 16 секунд
Цитата(S.A.G. @  8.5.2007,  01:28 Найти цитируемый пост)
Что сделает компилятор в данном случае, встретив такую запись?


Ругнется... такое недопустимо. Смотри пост выше.
А вообще любой учебник в зубы.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
S.A.G.
Дата 8.5.2007, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



JackYF, объясни плиз а то я совсем запутался..


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
S.A.G.
Дата 8.5.2007, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



так.. меня осенило... ссылка - просто второе имя для переменной... при применении ее в качестве параметра функции ссылка будет "вторым именем" для фактического параметра и к нему можно будет иметь прямой доступ...

Оказываеться все так просто... я сам поначалу запутался и меня запутали... Операция "&" не имеет ничего общего с определением адреса так же само как и "*" если они употребляються в объявлении переменной...

Кстати при применении ссылки в качестве параметра функции - единственный случай где ее не нужно "инициализировать" именем переменной.

Это сообщение отредактировал(а) S.A.G. - 8.5.2007, 02:07


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Xenon
Дата 8.5.2007, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



S.A.G., ссылка это синтаксическое упрощения указателя - компилятор, грубо говоря, сам подставляет оператор снятие косвенности. Иногда компилятор оптимизирует код так, что непосредственно объекта "ссылка" нет - просто общение с переменной идет. От указателя, вроде как, ссылка отличается еще и тем, что для простой ссылки требуется обязательно l-value и только того же типа, что и ссылка, а вот для констатной ссылки l-value необязательно и при несоотвествии типов будет неявное преобразование к типу, на который ссылается ссылка.


--------------------
user posted image  
PM MAIL   Вверх
S.A.G.
Дата 8.5.2007, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Цитата(Xenon)
оператор снятие косвенности

Не слышал о таком


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Xenon
Дата 8.5.2007, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



S.A.G., да что вы говорите? smile А как же:
Код

int* pTr = new int(10);
std::cout << *pTr; //Звездочка? :)
delete pTr;



--------------------
user posted image  
PM MAIL   Вверх
S.A.G.
Дата 8.5.2007, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Впервые слышу такое название для "*". В Си не встречалось. smile Если по отношению к ссылке применить такой.. "оператор снятия косвенности" то компилятор выдаст ошибку.

Это сообщение отредактировал(а) S.A.G. - 8.5.2007, 02:08


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Xenon
Дата 8.5.2007, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



S.A.G., ну естественно, потому что он ее сам подставляет smile


--------------------
user posted image  
PM MAIL   Вверх
S.A.G.
Дата 8.5.2007, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Цитата(Xenon @ 8.5.2007,  02:10)
S.A.G., ну естественно, потому что он ее сам подставляет smile

Да, я понял твою мысль. Просто ты несовсем корректно выразился. Ты хотел сказать что вместо ссылки компилер подставляет выражения для указателей.


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
EnergoHokum
Дата 8.5.2007, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Оператор * может применяться следующими способами:
как указатель, т.е int* a - здесь a содержит адрес какой-то переменной типа int
как взятие значения по адресу, т. е. b=*a - здесь b присваивается значение, которое лежит по адресу, который лежит в a ;-)
ну и простое умножение
Оператор & может применяться следующими способами:
как взятие адреса объекта, т. е. int* a=&b - здесь указателю a на int присваивается адрес переменной b
как ссылка, т. е. int& a=int b - здесь а является ссылкой на b
Для чего применяются ссылки? Ссылки применяются в основном для передачи параметров в функции по значению. В переводе с c++ на русский это означает следующее: если есть переменная, и функция, куда нужно эту переменную передать
Код

int a=10;
void func(int decrementValue)
{
    decrementValue--;
}
func(a);

то компилятор скопирует передаваемый параметр, и в данном примере декрементируется только decrementValue внутри самой функции, a останется неизменным. А если параметр функции объявить как ссылку
Код

int a=10;
void func(int& decrementValue)
{
    decrementValue--;
}
func(a);

то копирования не произойдёт, и a действительно будет декрементировано после выполнения функции. 
Вроде бы так ;-).
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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