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
Обе функции имеют локальные переменные, соответствующие их параметрам.
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