int main(int argc, char* argv[])
{
int i = 100;
std::cout<<"调用之前i的值" << i << std::endl;
std::cout << "调用之前i的地址" << &i << std::endl;
resnet(&i);
std::cout << "调用之后i的值" << i << std::endl;
std::cout << "调用之后i的地址" << &i << std::endl;
while (1);
}
void resnet(int *p)
{
std::cout << "p的地址" << p<<std::endl;
std::cout << "p的值" << *p<<std::endl;
int q = 0;
std::cout << "定义q=0的值" <<q << std::endl;
std::cout << "定义q=0的地址" << &q<< std::endl;
*p = q;
std::cout << "重新赋值之后p的值" << *p << std::endl;
std::cout << "重新赋值之后p的地址" << &p << std::endl;
}
调用之前i的值100
调用之前i的地址00000096E6DDFD04
p的地址00000096E6DDFD04
定义q=0的值0
定义q=0的地址00000096E6DDFBE4
重新赋值之后p的值0
重新赋值之后p的地址00000096E6DDFCE0
调用之后i的值0
调用之后i的地址00000096E6DDFD04
1.定义形参为i,在传入函数之前值为100,地址为FD04,
2.将i的地址作为参数传入形参*p,此时拷贝的是i的地址(值传递拷贝的是i的值),将i的地址拷贝过来以后p就是i的地址了即p==FD04,因为现在100就存在FDD4这个地址中,所以输出*p就得到了100.
3.重新定义一个变量q=0,并输出地址,可知q=0,其地址为FCA4。
4.将q的值放在p的地址里,即p还是FD04,但是*p=0,里边放的值变了,此时输出*p=0,p=FD04;但是此时p=FCE0(赋值过程可能有其他操作占用了一段内存)
5.调用函数之后i的值由100变为了0,i的地址没有发生变化,仍然是FD04。
同理:
void resnet(int *p)
{
std::cout << "p的值" << *p << std::endl;
std::cout << "p的地址" << p<<std::endl;
int q = 0;
std::cout << "定义q=0的值" <<q << std::endl;
std::cout << "定义q=0的地址" << &q<< std::endl;
p = &q;
std::cout << "重新赋值之后p的值" << *p << std::endl;
std::cout << "重新赋值之后p的地址" << &p << std::endl;
}
调用之前i的值100
调用之前i的地址00000033F478FCF4
p的值100
p的地址00000033F478FCF4
定义q=0的值0
定义q=0的地址00000033F478FBD4
重新赋值之后p的值0
重新赋值之后p的地址00000033F478FCD0
调用之后i的值100
调用之后i的地址00000033F478FCF4
指针传递的是一个变量或者一个值的地址,但是它本身还是采用值传递的方式。即你不能使它指向另外一块地址,但是你可以改变它指向的空间里存的值。