0
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
4

1 回答 1

3

这两个函数都有与其参数相对应的局部变量。

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
于 2014-08-09T17:52:00.930 回答