void test3_1(int a, int b, int c)
{
cout<<*(&c-2);//标记行1
}
void test3()
{
int x,y,z;
cin>>x>>y>>z;
test3_1(x,y,z);
}
输入:1 2 3
输出:1
在标记行1中输出的是1,即是a的值,因为函数调用中,是按实参表从右到左的顺序把参数压入栈中,且地址从高到低
所以
c的地址-0个int字节就是c
c的地址-1个int字节就是b
c的地址-2个int字节就是a
void test3_1(int* a, int* b, int* c)
{
cout<<**((&c)-1);//标记行2
}
void test3()
{
int x,y,z;
cin>>x>>y>>z;
test3_1(&x,&y,&z);
}
输入:1 2 3
输出:2
标记行2中&c得到c变量的值,然后&c-1得到b变量的地址,
然后*((&c)-1)得到b变量里存的值(因为b是一个指针,所以它里面的值为一个地址,它指向y的地址)
然后**((&c)-1)取出b里储存的值所指向的内存地址处的值。
void test3_1(int* a, int* b, int* c)
{
cout<<*((&c)[-1]);//标记行3
}
void test3()
{
int x,y,z;
cin>>x>>y>>z;
test3_1(&x,&y,&z);
}
输入:1 2 3
输出:2
标记行3中(&c)得到c变量的地址,然后(&c)[-1]得到b里面存储的值(即一个内存地址,它指向y的地址),
然后*((&c)[-1])得到b所存储的那个地址指向的内存地址处的值。