& и * - в чем разница?
На алгоритмическом есть:
1. Ссылка не может быть указывать на NULL.
2. Ссылка не может быть "неопределённой".
3. Ссылку нельзя перенацелить на другой объект.
4. При использовании ссылки обращение по адресу выполняется автоматически.
И есть на объектном уровне:
1. Конструктор копирования использует констнтную ссылку.
2. Оператор присваивания использует ссылку
3. Прочие переопределённые арифметическо-логические операторы используют ссылку.
4. Оператор -> - вызов методов/свойств для указателя - можно переопределять. А оператор . - нельзя.
Зависит от архитектуры.
& и * - в чем разница?
А в чем сходство?
* - операция обращения к динамической переменной (разименование указателя)
& - ссылка на адрес памяти, занимаемую статической переменной
Если ты о
int *a; то это, собственно, int* a; т.е. описание переменной типа int* (указателя).
Так (на неимением других условий) речь идёт про обычные прикладные программы, работающие на обычных процессорах под управлением обычной винды. Под "обычным" я подразумеваю 32-разрядность.
Я конечно понимаю, что "общепринятая терминология" :), но именно это словосочетание совершенно не перевариваю :(
Более того, сам термин ни коим образом не поясняет суть выполняемого действия. Предпочитаю куда более точное и понятное "обращение по адресу".
1. Ссылка не на адрес, а на значение по адресу.
2. "Статическая переменная" - это совсем иное.
То есть обычный? У меня обычный АМД Атлон-64 уже год, и в нем обычный указатель занимает 64-бита. И программы написанные для "обычных" 32-разрядных процессоров слетают с жутким скрипом и предсмертными судорогами.
Господа, используйте long для хранения указателей! На 32-битной платформе long 32-битное, а на 64-битной 64-битное...
А кто то до сих пор пользуется "обычными прикладными программами работающие на обычных процессорах под управлением обычной винды" версии 3.x )) И для них обычность - это 16-битная архитектура )))
Никогда не надо заморачиваться на на хардкодных константах, если есть средсва програмного определения размерности. И будет тогда код легко переносим.
Господа, используйте void* для хранения указателей :D
А вообще, если программа компилируется на 32 бита, то она будет работать как 32 даже на 64-разрядной машине. Просто потому что в машинном коде будут команды, которые обращаются к регистрам, как к 32-х разрядным. Знаете же разницу между AL/AH, AX и EAX.
Просто на некоторых процессорах и/или осях поддержка "старого" режима может быть криво реализована. Также (по соображениям безопасности) могут оказаться заблокированы некоторые действия программы.
Многие старые досовские программы под виндой (хоть 98, хоть NT) тоже могут плохо работать, но это не значит, что их левой ногой писали.
А вот когда производится компиляция под другую платформу, то тут уже нужно быть осторожными и не забывать про sizeof и прочее. Потому что некоторые базовые типы, например, int являются "аппаратно-зависимыми".
Или использовать "независимые" __int16, __int32, __int64, размер которых задаётся явно.
Прошу прощения, оффтоп конечно же :) , но достойный отдельной ветки форума.
А вот когда производится компиляция под другую платформу[/QUOTE]
Так о том и речь. Что не стоит хардкодить такие зависящие от железа параметры, если есть возможность этого не делать )
1. Ссылка не на адрес, а на значение по адресу.
[/QUOTE]
Спасибо, конечно, за исправление русского языка, но с каких пор &a даст значение по адресу (кстати, по какому - если не секрет).
[QUOTE=el scorpio]
2. "Статическая переменная" - это совсем иное.
[/QUOTE]
А что тогда статическая переменная, если не переменная описанная в теле программы как, например int a?
Ссылки не позволяют делать всего этого. Единственное где нельзя использовать указатели, это при перегрузке операторов.
static int a;:)
2ALL Всем спасибо! Вроде стало понятнее, а то братья по оружию спросили, а я и незнай, что им ответить - стыдно... :o
Оператор "&" в строке математическо-логических вычислений вернёт адрес укзанного объекта.
А вот использование "&" в объявлении сделает ссылку на область памяти, в которой расположен объект (значение)
"Статический" - объект, расположенный по определённому адресу, который не меняется во время работы программы. Статическая переменная доступна только в одной функции, но не теряет своё значение при выходе из программы. Статическое поле класса имеет отбщее значение для всех объектов данного класса и производных.
[QUOTE=Hydra]
& - ссылка на адрес памяти, занимаемую статической переменной
[/QUOTE]
[QUOTE=el scorpio]
1. Ссылка не на адрес, а на значение по адресу
[/QUOTE]
[QUOTE=el scorpio]
Оператор "&" в строке математическо-логических вычислений вернёт адрес укзанного объекта.
[/QUOTE]
А теперь, как говорится, почувствуйте разницу.
[QUOTE=Kulti]
static int a;
[/QUOTE]
И int a; и static int a; будут являтся статическими объектами в программе. Просто вести себя будут несколько по-разному, если будут описаны в структуре(классе) создаваемом динамически.
Разница: "ссылка на адрес памяти, занимаемую статической переменной
" означает, что сначала определяем адрес, на который указывает ссылка, а потом ещё и обращаемся по этому адресу куда-то ещё :D
Кроме того, ссылка может содержать адрес любого объекта, в том числе, и в куче.
1. "int a;" - означает, что адрес объекта "a" описывается смещением относительно границы стека (для локальной переменной), либо относительно адреса начала объекта (для поля класса).
2. "static int a;" - означает, что адрес объекта "a" описывается смещением относительно адреса области глобальных объектов.
3. "int *a;" и "int &a" - озачает, что адрес объекта описывается значением указателя (ссылки) "a", расположенным относительно "см. пункт 1". Область памяти, в которой расположен сам объект, роли не играет.
Не "static" объекты могут располагаться в любой области памяти, и их реальный адрес в памяти зависит от текущего момента программы.
"static", а также глобальные переменные и константы располагаются по определённому адресу, который в процессе выполнения не меняется.
Разница: "ссылка на адрес памяти, занимаемую статической переменной
" означает, что сначала определяем адрес, на который указывает ссылка, а потом ещё и обращаемся по этому адресу куда-то ещё
Кроме того, ссылка может содержать адрес любого объекта, в том числе, и в куче.
1. Сылка на адрес - это, по сути, адрес. Возможно не совсем корректно выразился, но "cсылка на адрес" и "адрес" в данном случае синонимы.
2. & может дать адрес только статического объекта. Где он расположен логически - не суть важно
"Статически" подразумевается "в стеке".
А хочешь, я приведу код, который выдаст адрес поля объекта типа "структура", расположенного в "куче"? :D
Tse_Mess_Array *ptr = new Tse_Mess_Array;
void *prop = (&ptr->Inv_Count_Items);
OutputDebugStringA (Format ("%p", ARRAYOFCONST((prop))).c_str());
delete ptr;
Выводит в моём случае ":00924DB4"