Почему нельзя записать так (компил выдает error; Codeblocks 10.05):
unsigned int x, y;
x = &y;
Ведь унарная операция "&" возвращает адрес (в данном случае переменной y).При этом printf ("%u", &y); - работает!
Получилось записать так: x = *&y; (что явл. обыкновенным присваиванием)
Другие языки программирования и технологии
Присваивание номера адреса. C++
Надо делать явное преобразование типа
x=(unsigned)&y;
x=(unsigned)&y;
Например, операционная система Windows 7 Professional поддерживает 192 GB оперативной памяти. Такое адресное пространство превышает количественные возможности типа данных unsigned int. Тем не менее позволяет использовать указатели. Это адреса в 32-разрядных системах ограничены диапазоном от 0x00000000 до 0xFFFFFFFF, в 64-разрядных системах он от 0x0000000000000000 до 0xFFFFFFFFFFFFFFFF.
Чтобы получить адрес переменной, нужно её объявить, потом объявить указатель и уже потом, используя операцию взятия адреса, занести его в указатель. При этом, указатель и переменная должны иметь одинаковый тип данных. Затем можно, используя предназначенный спецификатор, вывести этот адрес на экран в printf(). Кроме того следует учитывать, что объявленный указатель не инициализирован и хранит мусор. Чтобы к нему в таком виде невозможно было обратиться ему присваивают макроконстанту NULL, после чего адрес такого указателя всегда будет 0x00000000. Теперь пример:
Чтобы получить адрес переменной, нужно её объявить, потом объявить указатель и уже потом, используя операцию взятия адреса, занести его в указатель. При этом, указатель и переменная должны иметь одинаковый тип данных. Затем можно, используя предназначенный спецификатор, вывести этот адрес на экран в printf(). Кроме того следует учитывать, что объявленный указатель не инициализирован и хранит мусор. Чтобы к нему в таком виде невозможно было обратиться ему присваивают макроконстанту NULL, после чего адрес такого указателя всегда будет 0x00000000. Теперь пример:

Попытка присвоить переменной целого типа значение адреса.
Можно привести типы:
#include <iostream>
int main() {
unsigned int x, y;
x = (unsigned int)&y;
std::cout << (void *)x << std::endl;
}
Только какой в этом смысл? Эксперименты ради экспериментов, лучше бы книжку по С++ почитал.
> При этом printf ("%u", &y); - работает!
А printf'у вообще плевать на тип аргументов после форматной строки, он смотрит на форматную строку и считает, что следующий аргумент указанного в форматной строке типа. Типы аргументов после форматной строки не проверяются.
Можешь попробовать что-нть типа printf("%x\n%x\n%x\n") и получить на вывод кучу мусора из стека.
Можно привести типы:
#include <iostream>
int main() {
unsigned int x, y;
x = (unsigned int)&y;
std::cout << (void *)x << std::endl;
}
Только какой в этом смысл? Эксперименты ради экспериментов, лучше бы книжку по С++ почитал.
> При этом printf ("%u", &y); - работает!
А printf'у вообще плевать на тип аргументов после форматной строки, он смотрит на форматную строку и считает, что следующий аргумент указанного в форматной строке типа. Типы аргументов после форматной строки не проверяются.
Можешь попробовать что-нть типа printf("%x\n%x\n%x\n") и получить на вывод кучу мусора из стека.
Адрес может по формату совпадать с unsigned int, но совершенно не обязан. Кстати, адрес раньше вообще состоял из двух разных чисел - номера сегмента и смещения в сегменте. По всему по этому компилятор запрещает такое присваивание. Ну а если ты используешь явное приведение, не описанное в стандарте языка, то это равносильно "да будет воля моя... ", компилятор уже ни за что не отвечает.
Не сильно в С++ разбираюсь, но помоему вы пытаетесь переменной uint присвоить значение адреса (не то, что в нем содержится, а сам адрес) . Типы разные.
Операция & возвращает указатель. А присвоить значение указателя целочисленной переменной, конечно, нельзя. Если, конечно, не использовать явное приведение типов:
unsigned int x = reinterpret_cast< int >(&y);
или так:
unsigned int x = int(&y);
unsigned int x = reinterpret_cast< int >(&y);
или так:
unsigned int x = int(&y);
Правильный вариант:
size_t x = reinterpret_cast<size_t>(static_cast<void*>(&y));
Формат в printf - %Ia для vc++, %zu для gcc.
Использовать int, и даже unsigned, и даже long long, для хранения адреса нельзя. Использовать C-style касты не желательно.
size_t x = reinterpret_cast<size_t>(static_cast<void*>(&y));
Формат в printf - %Ia для vc++, %zu для gcc.
Использовать int, и даже unsigned, и даже long long, для хранения адреса нельзя. Использовать C-style касты не желательно.
Похожие вопросы
- Оператор присваивания C++
- Как осуществить операцию сложения в с++ без операции присваивания ? int a=5; int b=6; int c=a+b; ( без "= ")
- Ненужное присваивание в условии. С++
- Как перегружать оператор присваивания?
- ребят помогите с информатикой, нужны задачи по операции присваивания...
- Учусь програмировать на C++ по книге "C++ для чайников".Проблема.
- Помогите срочно C#
- c++: можно ли передать в класс адрес, описанного в нём элемента данных?
- Помогите исправить ошибку в программе (c++).
- Зачем нужен C++, если есть C?