鱼C论坛

 找回密码
 立即注册
查看: 963|回复: 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 编辑

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

程序内存
|----------|----------|   |----------|----------|   |----------|----------|
|0028ff30..|.....2....|   |0028ff30..|.....2....|   |0028ff30.#|.....2....|
|----------|----------|   |----------|----------|   |----------|----------|
|0028ff34..|.....8....|   |0028ff34..|.....8....|   |0028ff34.#|.....8....|
|----------|----------|   |----------|----------|   |----------|----------|
|0028ff38..|0028ff30..|   |0028ff38..|0028ff30..|   |0028ff38..|0028ff30..|
|----------|----------|   |----------|----------|   |----------|----------|
|0028ff3c..|0028ff34..|   |0028ff3c..|0028ff34..|   |0028ff3c..|0028ff34..|
|----------|----------|   |----------|----------|   |----------|----------|

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

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

栈
|----------|----------|   |----------|----------|   |----------|----------|
|0028ff20.#|0028ff30..|   |0028ff20.#|.....2....|   |0028ff20..|0028ff30..|参数a
|----------|----------|   |----------|----------|   |----------|----------|
|0028ff24.#|0028ff34..|   |0028ff24.#|.....8....|   |0028ff24..|0028ff34..|参数b
|----------|----------|   |----------|----------|   |----------|----------|
|0028ff28.#|..........|   |0028ff28.#|..........|   |0028ff28 #|..........|变量t
|----------|----------|   |----------|----------|   |----------|----------|
|          |          |   |          |          |   |          |          |
|----------|----------|   |----------|----------|   |----------|----------|

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

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

程序内存
|----------|----------|   |----------|----------|   |----------|----------|
|0028ff30..|.....2....|   |0028ff30..|.....2....|   |0028ff30.#|.....2....|
|----------|----------|   |----------|----------|   |----------|----------|
|0028ff34..|.....8....|   |0028ff34..|.....8....|   |0028ff34.#|.....8....|
|----------|----------|   |----------|----------|   |----------|----------|
|0028ff38..|0028ff30..|   |0028ff38..|0028ff30..|   |0028ff38..|0028ff30..|
|----------|----------|   |----------|----------|   |----------|----------|
|0028ff3c..|0028ff34..|   |0028ff3c..|0028ff34..|   |0028ff3c..|0028ff34..|
|----------|----------|   |----------|----------|   |----------|----------|

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

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

栈
|----------|----------|   |----------|----------|   |----------|----------|
|0028ff20.#|0028ff30..|   |0028ff20.#|.....2....|   |0028ff20..|0028ff30..|参数a
|----------|----------|   |----------|----------|   |----------|----------|
|0028ff24.#|0028ff34..|   |0028ff24.#|.....8....|   |0028ff24..|0028ff34..|参数b
|----------|----------|   |----------|----------|   |----------|----------|
|0028ff28.#|..........|   |0028ff28.#|..........|   |0028ff28 #|..........|变量t
|----------|----------|   |----------|----------|   |----------|----------|
|          |          |   |          |          |   |          |          |
|----------|----------|   |----------|----------|   |----------|----------|

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

使用道具 举报

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

   system("pause");
    return 0;
}

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

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 17:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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