Насколько я знаю, const int *
подразумевает, что я могу изменить указатель, но не данные, int * const
говорит, что я не могу изменить адрес указателя, но я могу изменить данные, и const int * const
заявляет, что я не могу изменить ни одного из них.
Тем не менее, я не могу изменить адрес указателя, определенного с типом const int *
, Вот мой пример кода:
void Func(const int * pInt)
{
static int Int = 0;
pInt = ∬
Int++;
}
int wmain(int argc, wchar_t *argv[])
{
int Dummy = 0;
const int * pInt = &Dummy;
//const int * pInt = nullptr; // Gives error when I try to pass it to Func().
std::cout << pInt << '\t' << *pInt << std::endl;
std::cout << "-------------------" << std::endl;
for (int i=0; i<5; i++)
{
Func(pInt); // Set the pointer to the internal variable. (But, it doesn't set it!)
std::cout << pInt << '\t' << *pInt << std::endl;
}
return 0;
}
Вывод кода:
00D2F9C4 0
-------------------
00D2F9C4 0
00D2F9C4 0
00D2F9C4 0
00D2F9C4 0
00D2F9C4 0
Я ожидал бы адрес pInt
изменить, чтобы указать на внутреннюю переменную внутри Func()
функция после вызова Func()
по крайней мере, один раз. Но это не так. Я продолжаю указывать на Dummy
переменная.
Что здесь происходит? Почему я не получаю ожидаемый результат?
(IDE: версия сообщества Visual Studio 2015)
Вы не видите изменения на сайте вызовов, потому что передаете указатель по значению. Модифицируя это внутри Func
просто изменит локальную копию, а не переданный указатель.
Если вы хотите изменить указатель и сделать изменения видимыми снаружи, передайте его по ссылке:
void Func(const int *& pInt)
// ^
Других решений пока нет …