c++ - 为什么我在传递 vl 或 vl1 时得到与输出相同的值 (0x7fff5fbff808)?地址应该不同

标签 c++ pointers pass-by-reference call-by-value

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/

相关文章:

C++11 模板别名作为模板模板参数导致不同的类型?

c++ - 我可以 #include 多个头文件吗?

C++:从子类访问父类

c - 奇怪的 malloc 行为

c++ - 为什么 Pass By Ref 不起作用

c++ - 静态初始化具有可变长度数组的结构

C++ 创建和销毁 unique_ptr 指针

c - 在 C 中将一个数组分配给另一个数组时出错

php - 最好不要将 &$ 与大字符串一起使用以节省内存吗?

c - 传递/修改多维数组以在 C 中运行