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的内容呢???恳请大神指教~
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指向的内存的值并没有变化。
按照小弟的理解: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进行交换。
简单说一下: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
问题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指向的内存的值并没有变化。
按照小弟的理解: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进行交换。
简单说一下: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
聆听大神指点,胜读十年书~~~
感谢了