鱼C论坛

 找回密码
 立即注册
查看: 756|回复: 9

[已解决]用指针进行换水操作

[复制链接]
发表于 2020-5-23 10:34:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 汤姆叔叔的小屋 于 2020-5-23 10:48 编辑

用指针进行换水操作,我的想法是改变指针变量所储存地址,来达到数值交换。程序能运行,但答案错误。
正确答案我已经知道了,但我想知道具体的理由,谁解释清楚,正确答案就是谁的。
#include<stdio.h>
void swap(int*a,int*b);
int main()
{
        int a=2, b=8, *p, *q;
        p=&a;
        q=&b;
      if(a<b)
      {
          swap(p,q);
      }
      printf("%d > %d",*p,*q);
         
        return 0;
}
void swap(int*a,int*b)
{
        int*t;
        t=a;
        a=b;
        b=t;
}
最佳答案
2020-5-24 13:01:44
本帖最后由 java2python 于 2020-5-24 13:12 编辑

为了保持格式,加了很多点,参数传递进去的总是内容,只不过这个内容是只想别的单元的指针
  1. 实际内存中在swap中参与操作的加了#标记

  2. 程序内存
  3. |----------|----------|   |----------|----------|   |----------|----------|
  4. |0028ff30..|.....2....|   |0028ff30..|.....2....|   |0028ff30.#|.....2....|
  5. |----------|----------|   |----------|----------|   |----------|----------|
  6. |0028ff34..|.....8....|   |0028ff34..|.....8....|   |0028ff34.#|.....8....|
  7. |----------|----------|   |----------|----------|   |----------|----------|
  8. |0028ff38..|0028ff30..|   |0028ff38..|0028ff30..|   |0028ff38..|0028ff30..|
  9. |----------|----------|   |----------|----------|   |----------|----------|
  10. |0028ff3c..|0028ff34..|   |0028ff3c..|0028ff34..|   |0028ff3c..|0028ff34..|
  11. |----------|----------|   |----------|----------|   |----------|----------|

  12. swap(p,q)                 swap(a,b)                 swap(p,q)

  13. ..t=a;......................t=a;......................t=*a;
  14. ..a=b;......................a=b;......................*a=*b;
  15. ..b=t;......................b=t;......................*b=t;
  16. 实际交换的:
  17. ............参数a,参数b...............参数a,参数b...............参数a,参数b里所指向的内容


  18. |----------|----------|   |----------|----------|   |----------|----------|
  19. |0028ff20.#|0028ff30..|   |0028ff20.#|.....2....|   |0028ff20..|0028ff30..|参数a
  20. |----------|----------|   |----------|----------|   |----------|----------|
  21. |0028ff24.#|0028ff34..|   |0028ff24.#|.....8....|   |0028ff24..|0028ff34..|参数b
  22. |----------|----------|   |----------|----------|   |----------|----------|
  23. |0028ff28.#|..........|   |0028ff28.#|..........|   |0028ff28 #|..........|变量t
  24. |----------|----------|   |----------|----------|   |----------|----------|
  25. |          |          |   |          |          |   |          |          |
  26. |----------|----------|   |----------|----------|   |----------|----------|
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-23 10:37:13 | 显示全部楼层
int t
t = *a;
*a = *b;
*b = t;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-23 10:40:49 | 显示全部楼层
  1. void swap(int*a,int*b)
  2. {
  3.         int t=*a;
  4.         *a=*b;
  5.         *b=t;
  6. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-23 10:41:03 | 显示全部楼层

能解释理由吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-23 10:43:27 | 显示全部楼层

传址参数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-23 10:45:23 | 显示全部楼层
  1. void swap(int*a,int*b){
  2. int*t=a;
  3. *a=*b;
  4. *b=*t;
  5. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-23 11:20:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-24 13:01:44 | 显示全部楼层    本楼为最佳答案   
本帖最后由 java2python 于 2020-5-24 13:12 编辑

为了保持格式,加了很多点,参数传递进去的总是内容,只不过这个内容是只想别的单元的指针
  1. 实际内存中在swap中参与操作的加了#标记

  2. 程序内存
  3. |----------|----------|   |----------|----------|   |----------|----------|
  4. |0028ff30..|.....2....|   |0028ff30..|.....2....|   |0028ff30.#|.....2....|
  5. |----------|----------|   |----------|----------|   |----------|----------|
  6. |0028ff34..|.....8....|   |0028ff34..|.....8....|   |0028ff34.#|.....8....|
  7. |----------|----------|   |----------|----------|   |----------|----------|
  8. |0028ff38..|0028ff30..|   |0028ff38..|0028ff30..|   |0028ff38..|0028ff30..|
  9. |----------|----------|   |----------|----------|   |----------|----------|
  10. |0028ff3c..|0028ff34..|   |0028ff3c..|0028ff34..|   |0028ff3c..|0028ff34..|
  11. |----------|----------|   |----------|----------|   |----------|----------|

  12. swap(p,q)                 swap(a,b)                 swap(p,q)

  13. ..t=a;......................t=a;......................t=*a;
  14. ..a=b;......................a=b;......................*a=*b;
  15. ..b=t;......................b=t;......................*b=t;
  16. 实际交换的:
  17. ............参数a,参数b...............参数a,参数b...............参数a,参数b里所指向的内容


  18. |----------|----------|   |----------|----------|   |----------|----------|
  19. |0028ff20.#|0028ff30..|   |0028ff20.#|.....2....|   |0028ff20..|0028ff30..|参数a
  20. |----------|----------|   |----------|----------|   |----------|----------|
  21. |0028ff24.#|0028ff34..|   |0028ff24.#|.....8....|   |0028ff24..|0028ff34..|参数b
  22. |----------|----------|   |----------|----------|   |----------|----------|
  23. |0028ff28.#|..........|   |0028ff28.#|..........|   |0028ff28 #|..........|变量t
  24. |----------|----------|   |----------|----------|   |----------|----------|
  25. |          |          |   |          |          |   |          |          |
  26. |----------|----------|   |----------|----------|   |----------|----------|
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-24 13:54:56 | 显示全部楼层
>>>我的想法是改变指针变量所储存地址,来达到数值交换
采用双重指针试一试?
  1. #include <stdio.h>
  2. #include <windows.h>
  3. void swap(int ** pa,int ** pb);
  4. int main(void)
  5. {
  6.     int a=2, b=8, *p, *q;
  7.         p=&a;
  8.         q=&b;
  9.       if(a<b)
  10.       {
  11.           //让p指向大的值
  12.           swap(&p,&q);
  13.       }
  14.       printf("%d > %d",*p,*q);

  15.    system("pause");
  16.     return 0;
  17. }

  18. void swap(int ** pa,int ** pb)
  19. {
  20.     int *t;
  21.     t = *pa;
  22.     *pa = *pb;
  23.     *pb = t;
  24. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-3 17:20:37 | 显示全部楼层
java2python 发表于 2020-5-24 13:01
为了保持格式,加了很多点,参数传递进去的总是内容,只不过这个内容是只想别的单元的指针

虽然我的水平完全不能让我看懂,但你认真回答的样子很帅。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 13:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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