Guest
10-10-2004, 00:33
Никак не понимаю как работает такая фича, как косвенная модификация.
Вот код:
#include <iostream>
#include <stdlib>
int main(void)
{
int const var = 1;
int const* pVar = &var;
cout << "var = " << var << " *pVar = " << *pVar << endl;
*(int*)pVar = 2;
cout << "var = " << var << " *pVar = " << *pVar << endl;
*(int*)&var = 3;
cout << "var = " << var << " *pVar = " << *pVar << endl;
system("PAUSE");
return 0;
}
В результате дает:
var = 1 *pVar = 1
var = 1 *pVar = 2
var = 1 *pVar = 3
Но что это за дела? Это же однин локальный указатель, как он может такое показывать, если в себе содержит просто адрес var?
И, собственно, что значит сам оператор *(int*)pVar = 2;? Вроде похоже на приведение типа, но как-то необычно...
Или вроде pVar приводится к int*, а затем, еще звездочка перед этим всем, чтобы можно было присвоить новое значение переменной на которую он ссылается? Дык переменная не изменяется!
Тогда, *(int*)&var = 3; - ячейки начиная с адреса &var приводятся к типу указателя на int, и эти ячейки затем разиминовываются.
Короче, нифега не понятно. А думать самому лень :-), так что может кто более опытный подскажет что это все такое :-).
Вопросы такие:
1. Что занчит *(int*)pVar = 2;
2. Что занчит *(int*)&var = 3;
3. И почему, черт возьми, указатель показывает что var равна 3, когда она равна 1??
Вот код:
#include <iostream>
#include <stdlib>
int main(void)
{
int const var = 1;
int const* pVar = &var;
cout << "var = " << var << " *pVar = " << *pVar << endl;
*(int*)pVar = 2;
cout << "var = " << var << " *pVar = " << *pVar << endl;
*(int*)&var = 3;
cout << "var = " << var << " *pVar = " << *pVar << endl;
system("PAUSE");
return 0;
}
В результате дает:
var = 1 *pVar = 1
var = 1 *pVar = 2
var = 1 *pVar = 3
Но что это за дела? Это же однин локальный указатель, как он может такое показывать, если в себе содержит просто адрес var?
И, собственно, что значит сам оператор *(int*)pVar = 2;? Вроде похоже на приведение типа, но как-то необычно...
Или вроде pVar приводится к int*, а затем, еще звездочка перед этим всем, чтобы можно было присвоить новое значение переменной на которую он ссылается? Дык переменная не изменяется!
Тогда, *(int*)&var = 3; - ячейки начиная с адреса &var приводятся к типу указателя на int, и эти ячейки затем разиминовываются.
Короче, нифега не понятно. А думать самому лень :-), так что может кто более опытный подскажет что это все такое :-).
Вопросы такие:
1. Что занчит *(int*)pVar = 2;
2. Что занчит *(int*)&var = 3;
3. И почему, черт возьми, указатель показывает что var равна 3, когда она равна 1??