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 | <= 0x7fff5fbff808
after the call of Stack
void ShowValue(int **value); ============= <= 0x7fff5fbff80C
| | <= 0x7fff5fbff808
calling function Stack
void ShowValue(int *value); ============= <= 0x7fff5fbff80C
| value | <= 0x7fff5fbff808
after the call of Stack
void ShowValue(int *value); ============= <= 0x7fff5fbff80C
| | <= 0x7fff5fbff808
关于c++ - 为什么我在传递 vl 或 vl1 时得到与输出相同的值 (0x7fff5fbff808)?地址应该不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25221301/