鱼C论坛

 找回密码
 立即注册
查看: 6109|回复: 14

用指针实现两个数大小的排列

[复制链接]
发表于 2013-2-25 16:31:36 | 显示全部楼层 |阅读模式

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

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

x
#include "stdio.h"

int a, b;
void main()
{
void exchange(int *po1, int *po2);
int *p1, *p2;
scanf("%d%d", &a, &b);
p1=&a;
p2=&b;
if(a<b)
exchange(p1, p2);
printf("%d>%d", *p1, *p2);
}

void exchange(int *po1, int *po2)
{
        int *p;

  p=po1;
  po1=po2;
  po2=p;

}

自己单步调试完exchange函数后,两个变量的地址确实发生交换了,但是返回main函数时,确又变成原来的样子了,求解释
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-2-25 16:35:31 | 显示全部楼层
速度来高手解答哈
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-25 17:02:09 | 显示全部楼层
  1. void exchange(int *po1, int *po2)
  2. {
  3.         int tmp;
  4. //你应该交换内容,而不是交换指针
  5.   tmp = *po2;
  6.   *po2=*po1;
  7.   *po1=tmp;

  8. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-2-25 17:59:35 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-2-25 18:05:48 | 显示全部楼层

#include “stdio.h”

void main()
{
int *p1, *p2, *p, a, b;

scanf("%d %d", &a, &b);
p1=&a;
p2=&b;

if(a<b)
{
p=p1;
p1=p2;
p2=p;
}

printf("max=%d, min=%d\n", *p1, *p2);
}
这个程序能实现交换,为啥
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-25 21:45:46 | 显示全部楼层
简单的说下~1.切记指针变量也是一个变量
int fun(int q )
{
     q ++ ;
}
int main(void)
{
     int a = 10 ;
     fun (a) ;
     printf("a的值为: %d" , a ) ;
     return 0 ;
}
在这里a的值会变化吗?
2.在被调函数中改变主函数中变量的值,只讨论在C语言下,那么方法就一个把变量的指针作为参数传递。
所以
#include <stdio.h>

int a, b;
void exchange(int *po1, int *po2);
void main()
{

        int *p1, *p2;
        scanf("%d%d", &a, &b);
        p1=&a;
        p2=&b;
        if(a<b)
                exchange(&p1, &p2);  // 这里不在传递指针变量,传递的是指针变量的指针(地址)
        printf("%d>%d", *p1, *p2);
}
       
void exchange(int **po1, int **po2)
{
        int *p;
       
        p=*po1;
        *po1=*po2;
        *po2=p;
       
}

你这个程序改成这个样子就行了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-25 21:46:16 | 显示全部楼层
林和靖 发表于 2013-2-25 18:05
#include “stdio.h”

void main()

因为你这个程序没有发生函数调用
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-2-25 22:13:01 | 显示全部楼层
akon 发表于 2013-2-25 21:45
简单的说下~1.切记指针变量也是一个变量
int fun(int q )
{

有点小迷糊了
p1=&a.对a用取址符号后那么p1不就是a的地址么,再用&p...貌似不对啊
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-26 00:17:43 | 显示全部楼层
指针是个变量,int a  a也是个变量~同样是变量,为什么指针变量不能取地址~要通过函数调用的方式去改变指针变量指向的指针值,取&怎么不对了哪?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-26 15:38:56 | 显示全部楼层
你改变的只是p1、p2的副本,它们本身没有被改变
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-26 17:54:59 | 显示全部楼层
exchange(int *, int *)函数在那里没有什么用。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-26 17:57:48 | 显示全部楼层
akon 发表于 2013-2-25 21:45
简单的说下~1.切记指针变量也是一个变量
int fun(int q )
{

void exchange(int *po1, int *po2);
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-26 19:32:32 | 显示全部楼层
喜欢散步 发表于 2013-2-26 17:57
void exchange(int *po1, int *po2);

他的是在函数内声明,我看的不是十分习惯,就拿到外面了!区别就是一个是全局,一个是局部
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-6 18:30:48 | 显示全部楼层
这里涉及到一个很好的内存使用的问题,当然楼上已经很多人有了正确的回答了这个问题,正确的解决的方法就是修改exchange函数参数改成 指针的指针,顺便说一下,函数本身让我看的也是很莫名,为什么通过修改地址来交换数字?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-7 19:25:15 | 显示全部楼层
其实就是函数调用的问题,函数调用时开辟了新的栈,因此虽然po1和po2的值在函数中变化了,但是函数退出后,系统销毁了函数的栈,因此两个变量值还是原来的值。但是使用*的话,是指向地址的,因此可以改变值
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-8 02:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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