Почему я получаю то же значение (0x7fff5fbff808), что и вывод при передаче vl или vl1? Адрес должен быть другим

void ShowValue(int **value)
{
std::cout<<"Value 0 = "<<**value<<"\t"<<*value<<"\t"<<value<<"\t"<<&value<<"\n";
}
void ShowValue(int *value)
{
std::cout<<"Value 1 = "<<*value<<"\t"<<value<<"\t"<<&value<<"\n";
}
void ShowValue(int &value)
{
std::cout<<"Value 2 = "<<value<<"\t"<<&value<<"\n";
}
void ShowValues(int value)
{
std::cout<<"Value 3 = "<<value<<"\t"<<&value<<"\n";
}

int main()
{
int *vl = new int(428);
int vl1=420;

std::cout<<*vl<<"\n";
std::cout<<vl<<"\n";
std::cout<<&vl<<"\n\n";

std::cout<<vl1<<"\n";
std::cout<<&vl1<<"\n\n";

ShowValue(&vl);
ShowValue(vl);
ShowValue(*vl);
ShowValues(*vl);

std::cout<<"\n";

ShowValue(&vl1);
ShowValue(vl1);
ShowValues(vl1);

return 0;
}

Выход:

428
0x100200060
0x7fff5fbff860

420
0x7fff5fbff85c

Value 0 = 428   0x100200060 0x7fff5fbff860  0x7fff5fbff808
Value 1 = 428   0x100200060 0x7fff5fbff808
Value 2 = 428   0x100200060
Value 3 = 428   0x7fff5fbff80c

Value 1 = 420   0x7fff5fbff85c  0x7fff5fbff808
Value 2 = 420   0x7fff5fbff85c
Value 3 = 420   0x7fff5fbff80c

0

Решение

Обе функции имеют локальные переменные, соответствующие их параметрам.

void ShowValue(int **value);
void ShowValue(int *value);

вот две локальные переменные одна имеет тип int ** а другой имеет тип int * но оба имеют одинаковый размер.

Поскольку обе функции размещают свои параметры в стеке и используют один и тот же стек, адреса этих локальных переменных одинаковы.

Чтобы было понятнее, рассмотрим цифры (при условии, что размер указателя равен 4)

Before a function call           Stack
=============   <= 0x7fff5fbff80C
|             |  <= 0x7fff5fbff808

calling function                 Stack
void ShowValue(int **value); =============   <= 0x7fff5fbff80C
|   value    |  <= 0x7fff5fbff808after the call of                Stack
void ShowValue(int **value);  =============   <= 0x7fff5fbff80C
|             |  <= 0x7fff5fbff808

calling function                 Stack
void ShowValue(int *value);  =============   <= 0x7fff5fbff80C
|   value    |  <= 0x7fff5fbff808after the call of                Stack
void ShowValue(int *value);   =============   <= 0x7fff5fbff80C
|             |  <= 0x7fff5fbff808
3

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector