Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

& и * - в чем разница?

8.9K
09 ноября 2006 года
Kulti
77 / / 29.07.2006
Полазил я по форуму, что-то ничего подобного не нашел. Может кто скажет в чем разница между указалтелем и амперсанацией? Вроде и тот и этот числа (адреса)... Но на физическом или каком-нить другом уровне они же должны различацца!
242
09 ноября 2006 года
Оlga
2.2K / / 04.02.2006
http://forum.codenet.ru/showthread.php?t=25014
309
09 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
На физическом уровне разницы нет - и в том, и в другом случае используется адрес (32 бита) и выполняется "обращение по адресу".
На алгоритмическом есть:
1. Ссылка не может быть указывать на NULL.
2. Ссылка не может быть "неопределённой".
3. Ссылку нельзя перенацелить на другой объект.
4. При использовании ссылки обращение по адресу выполняется автоматически.
И есть на объектном уровне:
1. Конструктор копирования использует констнтную ссылку.
2. Оператор присваивания использует ссылку
3. Прочие переопределённые арифметическо-логические операторы используют ссылку.
4. Оператор -> - вызов методов/свойств для указателя - можно переопределять. А оператор . - нельзя.
240
09 ноября 2006 года
aks
2.5K / / 14.07.2006
[QUOTE=el scorpio]используется адрес (32 бита) [/QUOTE]
Зависит от архитектуры.
547
09 ноября 2006 года
Hydra
488 / / 20.06.2006
Цитата:

& и * - в чем разница?


А в чем сходство?
* - операция обращения к динамической переменной (разименование указателя)
& - ссылка на адрес памяти, занимаемую статической переменной
Если ты о
int *a; то это, собственно, int* a; т.е. описание переменной типа int* (указателя).

309
09 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=aks]Зависит от архитектуры.[/QUOTE]
Так (на неимением других условий) речь идёт про обычные прикладные программы, работающие на обычных процессорах под управлением обычной винды. Под "обычным" я подразумеваю 32-разрядность.

Цитата:
* - операция обращения к динамической переменной (разЫменование указателя)



Я конечно понимаю, что "общепринятая терминология" :), но именно это словосочетание совершенно не перевариваю :(
Более того, сам термин ни коим образом не поясняет суть выполняемого действия. Предпочитаю куда более точное и понятное "обращение по адресу".

Цитата:
& - ссылка на адрес памяти, занимаемую статической переменной


1. Ссылка не на адрес, а на значение по адресу.
2. "Статическая переменная" - это совсем иное.

5.4K
09 ноября 2006 года
Svyatozar
221 / / 11.09.2006
[QUOTE=el scorpio]Так (на неимением других условий) речь идёт про обычные прикладные программы, работающие на обычных процессорах под управлением обычной винды. Под "обычным" я подразумеваю 32-разрядность.[/QUOTE]
То есть обычный? У меня обычный АМД Атлон-64 уже год, и в нем обычный указатель занимает 64-бита. И программы написанные для "обычных" 32-разрядных процессоров слетают с жутким скрипом и предсмертными судорогами.

Господа, используйте long для хранения указателей! На 32-битной платформе long 32-битное, а на 64-битной 64-битное...
240
09 ноября 2006 года
aks
2.5K / / 14.07.2006
el scorpio, обычность понятие относительное ) Svyatozar прав. У когото давно уже стоит 64-битная архитектура на десктопе.
А кто то до сих пор пользуется "обычными прикладными программами работающие на обычных процессорах под управлением обычной винды" версии 3.x )) И для них обычность - это 16-битная архитектура )))

Никогда не надо заморачиваться на на хардкодных константах, если есть средсва програмного определения размерности. И будет тогда код легко переносим.
309
09 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Svyatozar]Господа, используйте long для хранения указателей! На 32-битной платформе long 32-битное, а на 64-битной 64-битное...[/QUOTE]
Господа, используйте void* для хранения указателей :D

А вообще, если программа компилируется на 32 бита, то она будет работать как 32 даже на 64-разрядной машине. Просто потому что в машинном коде будут команды, которые обращаются к регистрам, как к 32-х разрядным. Знаете же разницу между AL/AH, AX и EAX.
Просто на некоторых процессорах и/или осях поддержка "старого" режима может быть криво реализована. Также (по соображениям безопасности) могут оказаться заблокированы некоторые действия программы.
Многие старые досовские программы под виндой (хоть 98, хоть NT) тоже могут плохо работать, но это не значит, что их левой ногой писали.


А вот когда производится компиляция под другую платформу, то тут уже нужно быть осторожными и не забывать про sizeof и прочее. Потому что некоторые базовые типы, например, int являются "аппаратно-зависимыми".
Или использовать "независимые" __int16, __int32, __int64, размер которых задаётся явно.


Прошу прощения, оффтоп конечно же :) , но достойный отдельной ветки форума.
240
09 ноября 2006 года
aks
2.5K / / 14.07.2006
[QUOTE=el scorpio]
А вот когда производится компиляция под другую платформу[/QUOTE]
Так о том и речь. Что не стоит хардкодить такие зависящие от железа параметры, если есть возможность этого не делать )
547
09 ноября 2006 года
Hydra
488 / / 20.06.2006
[QUOTE=el scorpio]
1. Ссылка не на адрес, а на значение по адресу.
[/QUOTE]
Спасибо, конечно, за исправление русского языка, но с каких пор &a даст значение по адресу (кстати, по какому - если не секрет).
[QUOTE=el scorpio]
2. "Статическая переменная" - это совсем иное.
[/QUOTE]
А что тогда статическая переменная, если не переменная описанная в теле программы как, например int a?
5.4K
09 ноября 2006 года
Svyatozar
221 / / 11.09.2006
В некоторых случаях они взаимозаменяемые, но так называемый "массив Си" реализован указателем. Только указатель поддерживает арифметику для вычисления нового адреса на который он будет указывать. Указатели позволяют сделать массив указателей на указатели на указатели... int **p; - указатель на указатель... Указатель надо проверять на ноль, так как многие функции возвращают нулевой указатель как специальное значение.

Ссылки не позволяют делать всего этого. Единственное где нельзя использовать указатели, это при перегрузке операторов.
8.9K
09 ноября 2006 года
Kulti
77 / / 29.07.2006
[QUOTE=Hydra] А что тогда статическая переменная, если не переменная описанная в теле программы как, например int a?[/QUOTE]
static int a;:)

2ALL Всем спасибо! Вроде стало понятнее, а то братья по оружию спросили, а я и незнай, что им ответить - стыдно... :o
309
10 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Hydra]Спасибо, конечно, за исправление русского языка, но с каких пор &a даст значение по адресу (кстати, по какому - если не секрет).[/QUOTE]
Оператор "&" в строке математическо-логических вычислений вернёт адрес укзанного объекта.
А вот использование "&" в объявлении сделает ссылку на область памяти, в которой расположен объект (значение)

Цитата:
А что тогда статическая переменная, если не переменная описанная в теле программы как, например int a?


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

547
10 ноября 2006 года
Hydra
488 / / 20.06.2006
А теперь читаем:
[QUOTE=Hydra]
& - ссылка на адрес памяти, занимаемую статической переменной
[/QUOTE]
[QUOTE=el scorpio]
1. Ссылка не на адрес, а на значение по адресу
[/QUOTE]
[QUOTE=el scorpio]
Оператор "&" в строке математическо-логических вычислений вернёт адрес укзанного объекта.
[/QUOTE]
А теперь, как говорится, почувствуйте разницу.
[QUOTE=Kulti]
static int a;
[/QUOTE]
И int a; и static int a; будут являтся статическими объектами в программе. Просто вести себя будут несколько по-разному, если будут описаны в структуре(классе) создаваемом динамически.
309
10 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Hydra]как говорится, почувствуйте разницу.[/QUOTE]
Разница: "ссылка на адрес памяти, занимаемую статической переменной
" означает, что сначала определяем адрес, на который указывает ссылка, а потом ещё и обращаемся по этому адресу куда-то ещё :D
Кроме того, ссылка может содержать адрес любого объекта, в том числе, и в куче.

Цитата:
И int a; и static int a; будут являтся статическими объектами в программе. Просто вести себя будут несколько по-разному, если будут описаны в структуре(классе) создаваемом динамически.


1. "int a;" - означает, что адрес объекта "a" описывается смещением относительно границы стека (для локальной переменной), либо относительно адреса начала объекта (для поля класса).
2. "static int a;" - означает, что адрес объекта "a" описывается смещением относительно адреса области глобальных объектов.
3. "int *a;" и "int &a" - озачает, что адрес объекта описывается значением указателя (ссылки) "a", расположенным относительно "см. пункт 1". Область памяти, в которой расположен сам объект, роли не играет.

Не "static" объекты могут располагаться в любой области памяти, и их реальный адрес в памяти зависит от текущего момента программы.

"static", а также глобальные переменные и константы располагаются по определённому адресу, который в процессе выполнения не меняется.

547
10 ноября 2006 года
Hydra
488 / / 20.06.2006
Цитата:

Разница: "ссылка на адрес памяти, занимаемую статической переменной
" означает, что сначала определяем адрес, на который указывает ссылка, а потом ещё и обращаемся по этому адресу куда-то ещё
Кроме того, ссылка может содержать адрес любого объекта, в том числе, и в куче.


1. Сылка на адрес - это, по сути, адрес. Возможно не совсем корректно выразился, но "cсылка на адрес" и "адрес" в данном случае синонимы.
2. & может дать адрес только статического объекта. Где он расположен логически - не суть важно

309
10 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Hydra] 2. & может дать адрес только статического объекта. Где он расположен логически - не суть важно[/QUOTE]
"Статически" подразумевается "в стеке".
А хочешь, я приведу код, который выдаст адрес поля объекта типа "структура", расположенного в "куче"? :D

 
Код:
//Borland C++ Builder, структура - моя, первая попавшаяся под горячую руку :)
Tse_Mess_Array *ptr = new Tse_Mess_Array;
void *prop = (&ptr->Inv_Count_Items);
OutputDebugStringA (Format ("%p", ARRAYOFCONST((prop))).c_str());
delete ptr;

Выводит в моём случае ":00924DB4"
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог