OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7589|回复: 13

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

[复制链接]

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2016-1-27 22:40:11 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 liuchang 于 2016-1-27 22:46 编辑

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



最佳答案

查看完整内容[请看2#楼]

对c++不熟,不过我觉得这部分很c应该相同的。 问题1:实参wallet1的地址跟传递给指针p的地址是一样的吗??? wallet1的地址和指针变量p的值是一样的,但是指针变量p本身的地址与wallet1的地址不同。临时变量wallet1的地址应该在栈上,指针变量p可能在不同的栈上或在通用寄存器Rx上。 按照小弟的理解:wallet1是存储在普通内存当中的,而指针p是存储在栈当中的,两者的地址应该是不一样的吧,只是值相同而已.那下图中p的地址该如 ...
电子爱好者
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-1-27 22:40:12 | 显示全部楼层
对c++不熟,不过我觉得这部分很c应该相同的。

问题1:实参wallet1的地址跟传递给指针p的地址是一样的吗???
wallet1的地址和指针变量p的值是一样的,但是指针变量p本身的地址与wallet1的地址不同。临时变量wallet1的地址应该在栈上,指针变量p可能在不同的栈上或在通用寄存器Rx上。


按照小弟的理解:wallet1是存储在普通内存当中的,而指针p是存储在栈当中的,两者的地址应该是不一样的吧,只是值相同而已.那下图中p的地址该如何理解,是系统从栈上申请的临时地址?
问题2:我认为:不管形参采用的是变量,还是变量的地址,从实参传递给形参的始终是变量的值,这样理解正确吗?恳请大神指教~~~
wallet1是整型变量,p是指针变量,两者的地址不一样(如上回答),这两个变量的值也不能说相同,wallet1的值为300,p的值为wallet1的地址0x0018fc7c;
“不管形参采用的是变量,还是变量的地址,从实参传递给形参的始终是变量的值”,这句话我有点没理解,如果还是按照wallet1的例子来说的话,实参传递的还是wallet1的地址,而不是值300。


问题3:教程中被调用函数是采用{int temp; temp = *p;*p=*q:*q=temp;}来完成的.
那我现在将其改为采用传递地址,为什么实际上并没有交换wallet1和wallet2的内容呢???恳请大神指教~
你仅仅交换了“指针变量”p,q的值,p的值为wallet1的地址,q的值为wallet2的地址,当然不会让wallet1/2交换数据啦

盒子A中有苹果,盒子B中有橙子
盒子A放在桌子上,盒子B放在椅子上
现在把盒子A放到椅子上,盒子B放到桌子上
盒子A里还是苹果,盒子B中还是橙子。

有点绕。。。。我也不知道说的对不对了

机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2016-1-28 08:44:34 | 显示全部楼层
本帖最后由 jiutianshenjian 于 2016-1-28 09:02 编辑

对c++不熟,不过我觉得这部分很c应该相同的。

楼上举得例子大概是这样:苹果和橙子就是wallet1和wallet2
盒子A就是wallet1的地址
盒子B就是wallet2的地址
桌子就是盒子A的地址
椅子就是盒子B的地址

你现在是把盒子A和B复制了一份(例如是盒子X和盒子Y)给了swap函数,然后在swap里面交换了这两个复制的盒子X和Y。你说这跟苹果和橙子有关系吗?
你可以这样,通过*盒子X找到苹果,*盒子Y找到橙子。然后交换。
*盒子X为什么能找到苹果呢,应为X和A的值是一样的,都是苹果的地址。

我粗略看了下,这个你应该好好看看指针那里。不能光解决这一个问题。
推荐找找郝斌的C语言视频教程,指针部分。
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2016-1-28 08:51:06 | 显示全部楼层
本帖最后由 jiutianshenjian 于 2016-1-28 08:54 编辑

1.你要在一个函数里面(如main)通过调用别的函数(如swap)改变任何本函数(main)中的局部的变量(如wallet1),必须将变量地址传递过去。是复制一份传递过去的。
2.然后在被调函数(swap)里,通过对地址的*操作(如*p),来操作原函数里的那个变量(wallet1)。

如果int *P = &wallet1;
那么*p就是wallet1.
局部非静态变量,应该都是在栈里。
小小蜗牛
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-1-28 09:30:16 | 显示全部楼层
jiutianshenjian 发表于 2016-1-28 08:44
对c++不熟,不过我觉得这部分很c应该相同的。

楼上举得例子大概是这样:苹果和橙子就是wallet1和wallet2 ...

感谢回复~~

我这里是这样理解swap函数的:
调用swap(&wallet1, &wallet2)   --------->     把盒子A(&wallet1)和盒子B(&wallet2)给一个叫swap的人,让他交换盒子AB中的东西。
执行swap(int *p, int *q)               --------->    swap这个人暂时把盒子A放到桌子(p)上,把盒子B放到椅子(q)上
一般的做法:
{int temp; temp = *p;*p=*q:*q=temp;}  ------>   把桌子上盒子里的苹果(300)放到手里,把椅子上盒子的橙子(350)放到桌子的盒子里,把手里的苹果放到椅子上的盒子里,这样盒子A和盒子B的东西就交换了。

楼主的问题:
{int *temp; temp = p; p=q:q=temp;}  ------>   把盒子A从桌子上放到地上(temp),把盒子B从椅子放到桌子上,把盒子A从地上放到桌子上,这样仅仅是盒子AB在swap这个人的桌子和椅子上交换了位置,盒子AB中的东西没有交换
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2016-1-28 10:14:14 | 显示全部楼层
哦,理解你的意思。

要交换盒子里的东西。必须拆盒子。他没拆盒子无论如何都是失败。

让楼主想想是怎么拆开盒子的。
我先把两个合为一个函数,也许比较容易理解。

int main()
{
        using namespace std;

        int wallet1 = 300;
        int wallet2 = 350;

        int *p = &walet1;
        int *q = &wallet2;
        int *temp;

        temp = p;
         p= q;
        q = temp;

        return 0;
}

楼主你把你写的两个合起来这样看看,你这样交换的结果,就是p指向wallet2,q指向wallet1.再没干啥别的。
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2016-1-28 10:21:43 | 显示全部楼层
针对你的问题我发表下自己理解的答案:
问题1:实参wallet1的地址跟传递给指针p的地址是一样的吗?
答:是相等的。
按照小弟的理解:wallet1是存储在普通内存当中的,而指针p是存储在栈当中的,两者的地址应该是不一样的吧,只是值相同而已.那下图中p的地址该如何理解,是系统从栈上申请的临时地址?
答:都是局部变量,都在栈中。
问题2:我认为:不管形参采用的是变量,还是变量的地址,从实参传递给形参的始终是变量的值,这样理解正确吗?恳请大神指教~~~
答:形参只能是变量。指针变量也是变量。变量的地址那是固定的东西,是实参。传递的什么东西一目了然,&wallet1就是传递的wallet1的地址值。


还是那句话,建议你看看郝斌C语言视频。这一块讲的还可以。
小小蜗牛
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-1-28 11:24:52 | 显示全部楼层
聆听ianhom大神和jiutianshenjian大神细心指导,不胜感激~~~
小弟在细心揣摩下,拜读了~
电子爱好者
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2016-1-28 11:25:23 来自手机 | 显示全部楼层
熟练应用C语言的指针是基本功,楼主慢慢磨练吧。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2016-1-28 17:21:14 | 显示全部楼层
liuchang 发表于 2016-1-28 11:24
聆听ianhom大神和jiutianshenjian大神细心指导,不胜感激~~~
小弟在细心揣摩下,拜读了~

互相学习,共同进步。
小小蜗牛
回复

使用道具 举报

5

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2015-8-25
在线时间
27 小时
发表于 2016-1-28 17:25:50 | 显示全部楼层
成为会员这么久了,真的没发现什么大神,我知道肯定有大神,但是大神都不说话,都是些菜鸟和新手在这里自娱自乐
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-1-29 13:24:21 | 显示全部楼层
我认为的大神:
只要它能解答我心中的疑惑,至少能说明他在某个特定的方面比我强
我向人家请教问题,为何不能"尊称"下人家呢?
电子爱好者
回复

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-1-14
在线时间
24 小时
发表于 2016-1-31 09:17:12 | 显示全部楼层
如果你学c++比较深入的话,书中应该提到过
“值传递”和 “地址传递”的说法。
c语言只有“值传递“,就是把你的实参的值传递给形参,形参最后的结果并不会修改实参的值。 这也是 swap(int a, int b) 这种函数不起作用的原因。

但c++弥补了这种缺陷,它使用 &(引用) 这种方法 实现了 地址传递
就是相当于 实参和形参是共用内存地址,指向的是同一个数据, 只是形参是是实参的一个别名。
比如  
swap(int &a , int &b)
{
     int temp;
     temp = a;
     a = b;
     b = temp;
}

在main 函数调用这个函数就可以实现数值交换的功能。
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-2-2 08:57:38 | 显示全部楼层
feiting94 发表于 2016-1-31 09:17
如果你学c++比较深入的话,书中应该提到过
“值传递”和 “地址传递”的说法。
c语言只有“值传递“,就 ...

是这样的,感谢大神~
电子爱好者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 03:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表