关于C++指针参数调用问题,请大神指教~~~

时间:2021-05-23 19:02:28
void swapp(int *p,int *q);
int main()
{
        using namespace std;
 
        int wallet1 = 300;
        int wallet2 = 350;
        swapp(&wallet1,&wallet2);
        return 0;
}
void swapp(int *p,int *q)
{
        int *temp;
        temp = p;
        p = q;
        q = temp;
}

问题说明:这个是小弟在看C++ plus上的例程,但是被调用函数swapp()被我修改过~
问题1:实参wallet1的地址跟传递给指针p的地址是一样的吗???
按照小弟的理解:wallet1是存储在普通内存当中的,而指针p是存储在栈当中的,两者的地址应该是不一样的吧,只是值相同而已.那下图中p的地址该如何理解,是系统从栈上申请的临时地址?
问题2:我认为:不管形参采用的是变量,还是变量的地址,从实参传递给形参的始终是变量的值,这样理解正确吗?恳请大神指教~~~
问题3:教程中被调用函数是采用{int temp; temp = *p;*p=*q:*q=temp;}来完成的.
那我现在将其改为采用传递地址,为什么实际上并没有交换wallet1和wallet2的内容呢???恳请大神指教~
关于C++指针参数调用问题,请大神指教~~~

6 个解决方案

#1


问题1:实参wallet1的地址跟传递给指针p的地址是一样的吗???
按照小弟的理解:wallet1是存储在普通内存当中的,而指针p是存储在栈当中的,两者的地址应该是不一样的吧,只是值相同而已.那下图中p的地址该如何理解,是系统从栈上申请的临时地址?

是一样的。取地址了作为参数传,那必须是一样的。wallet1存储在普通内存中这个说法很奇怪,就是在栈上,和p一样。p的地址和wallet1的地址不一样,实际上,p的值是wallet1的地址,而wallet1的值是300。 

------------------------------  我是分割线 ----------------------------------
问题2:我认为:不管形参采用的是变量,还是变量的地址,从实参传递给形参的始终是变量的值,这样理解正确吗?恳请大神指教~~~

始终是变量的值这个说法不对,变量和变量的地址作为参数,怎么会都是变量的值?显然不是。

------------------------------  我是分割线 ----------------------------------
问题3:教程中被调用函数是采用{int temp; temp = *p;*p=*q:*q=temp;}来完成的.
那我现在将其改为采用传递地址,为什么实际上并没有交换wallet1和wallet2的内容呢???恳请大神指教~

采用传地址是没错,但是,p和q的值的变化并不会导致wallet1与wallet2的地址变化。 p和q是指针,p的地址是p_addr, p的值是wallet1_addr, wallet1的值是300。q也一样,q的地址是q_addr, q的值是wallet2_addr。
p=q ==> p_addr所在的内存单元的值变成wallet2_addr, 但是wallet2_addr指向的内存的值并没有变化。 

#2


问得挺多,楼上回复得也很细。
简单说一下:p和q是函数里临时的形参变量,被分别赋值为wallet1和wallet2的地址值,然后p和q指针变量本身进行交换,函数结束,p和q也回收,并没有影响到wallet1和wallet2的值。而{int temp; temp = *p;*p=*q:*q=temp;}才是p和q指向的变量wallet1和wallet2进行交换。

#3


void swapp(int *p,int *q)
{
        int temp;
        temp = *p;
        *p = *q;
        *q = temp;
}

#4


交换值得话传递指针等同于地址传递,但是你交换的是指针,实际上还是值传递

#6


引用 1 楼 coding_hello 的回复:
问题1:实参wallet1的地址跟传递给指针p的地址是一样的吗???
按照小弟的理解:wallet1是存储在普通内存当中的,而指针p是存储在栈当中的,两者的地址应该是不一样的吧,只是值相同而已.那下图中p的地址该如何理解,是系统从栈上申请的临时地址?

是一样的。取地址了作为参数传,那必须是一样的。wallet1存储在普通内存中这个说法很奇怪,就是在栈上,和p一样。p的地址和wallet1的地址不一样,实际上,p的值是wallet1的地址,而wallet1的值是300。 

------------------------------  我是分割线 ----------------------------------
问题2:我认为:不管形参采用的是变量,还是变量的地址,从实参传递给形参的始终是变量的值,这样理解正确吗?恳请大神指教~~~

始终是变量的值这个说法不对,变量和变量的地址作为参数,怎么会都是变量的值?显然不是。

------------------------------  我是分割线 ----------------------------------
问题3:教程中被调用函数是采用{int temp; temp = *p;*p=*q:*q=temp;}来完成的.
那我现在将其改为采用传递地址,为什么实际上并没有交换wallet1和wallet2的内容呢???恳请大神指教~

采用传地址是没错,但是,p和q的值的变化并不会导致wallet1与wallet2的地址变化。 p和q是指针,p的地址是p_addr, p的值是wallet1_addr, wallet1的值是300。q也一样,q的地址是q_addr, q的值是wallet2_addr。
p=q ==> p_addr所在的内存单元的值变成wallet2_addr, 但是wallet2_addr指向的内存的值并没有变化。 

聆听大神指点,胜读十年书~~~
感谢了

#1


问题1:实参wallet1的地址跟传递给指针p的地址是一样的吗???
按照小弟的理解:wallet1是存储在普通内存当中的,而指针p是存储在栈当中的,两者的地址应该是不一样的吧,只是值相同而已.那下图中p的地址该如何理解,是系统从栈上申请的临时地址?

是一样的。取地址了作为参数传,那必须是一样的。wallet1存储在普通内存中这个说法很奇怪,就是在栈上,和p一样。p的地址和wallet1的地址不一样,实际上,p的值是wallet1的地址,而wallet1的值是300。 

------------------------------  我是分割线 ----------------------------------
问题2:我认为:不管形参采用的是变量,还是变量的地址,从实参传递给形参的始终是变量的值,这样理解正确吗?恳请大神指教~~~

始终是变量的值这个说法不对,变量和变量的地址作为参数,怎么会都是变量的值?显然不是。

------------------------------  我是分割线 ----------------------------------
问题3:教程中被调用函数是采用{int temp; temp = *p;*p=*q:*q=temp;}来完成的.
那我现在将其改为采用传递地址,为什么实际上并没有交换wallet1和wallet2的内容呢???恳请大神指教~

采用传地址是没错,但是,p和q的值的变化并不会导致wallet1与wallet2的地址变化。 p和q是指针,p的地址是p_addr, p的值是wallet1_addr, wallet1的值是300。q也一样,q的地址是q_addr, q的值是wallet2_addr。
p=q ==> p_addr所在的内存单元的值变成wallet2_addr, 但是wallet2_addr指向的内存的值并没有变化。 

#2


问得挺多,楼上回复得也很细。
简单说一下:p和q是函数里临时的形参变量,被分别赋值为wallet1和wallet2的地址值,然后p和q指针变量本身进行交换,函数结束,p和q也回收,并没有影响到wallet1和wallet2的值。而{int temp; temp = *p;*p=*q:*q=temp;}才是p和q指向的变量wallet1和wallet2进行交换。

#3


void swapp(int *p,int *q)
{
        int temp;
        temp = *p;
        *p = *q;
        *q = temp;
}

#4


交换值得话传递指针等同于地址传递,但是你交换的是指针,实际上还是值传递

#5


#6


引用 1 楼 coding_hello 的回复:
问题1:实参wallet1的地址跟传递给指针p的地址是一样的吗???
按照小弟的理解:wallet1是存储在普通内存当中的,而指针p是存储在栈当中的,两者的地址应该是不一样的吧,只是值相同而已.那下图中p的地址该如何理解,是系统从栈上申请的临时地址?

是一样的。取地址了作为参数传,那必须是一样的。wallet1存储在普通内存中这个说法很奇怪,就是在栈上,和p一样。p的地址和wallet1的地址不一样,实际上,p的值是wallet1的地址,而wallet1的值是300。 

------------------------------  我是分割线 ----------------------------------
问题2:我认为:不管形参采用的是变量,还是变量的地址,从实参传递给形参的始终是变量的值,这样理解正确吗?恳请大神指教~~~

始终是变量的值这个说法不对,变量和变量的地址作为参数,怎么会都是变量的值?显然不是。

------------------------------  我是分割线 ----------------------------------
问题3:教程中被调用函数是采用{int temp; temp = *p;*p=*q:*q=temp;}来完成的.
那我现在将其改为采用传递地址,为什么实际上并没有交换wallet1和wallet2的内容呢???恳请大神指教~

采用传地址是没错,但是,p和q的值的变化并不会导致wallet1与wallet2的地址变化。 p和q是指针,p的地址是p_addr, p的值是wallet1_addr, wallet1的值是300。q也一样,q的地址是q_addr, q的值是wallet2_addr。
p=q ==> p_addr所在的内存单元的值变成wallet2_addr, 但是wallet2_addr指向的内存的值并没有变化。 

聆听大神指点,胜读十年书~~~
感谢了