鱼C论坛

 找回密码
 立即注册
查看: 1396|回复: 20

[已解决]救救孩子吧

[复制链接]
发表于 2020-3-19 21:26:06 | 显示全部楼层 |阅读模式

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

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

x
通过指针来从大到小排列数据,swap函数用来调换pointer_1和pointer_2的地址,
小甲鱼的方法是通过调换*pointer_1和*pointer_2的值来做的。但是我想在函数swap
中调换pointer_1和pointer_2的值来做。可是并没有效果,求各位大神们帮忙
#include <stdio.h>
void main()
{
        int a,b;
        void swap(int *a,int *b);
        int *pointer_1,*pointer_2;
        scanf("%d,%d",&a,&b);
        pointer_1=&a;               
        pointer_2=&b;       
        if(a<b)                       
        {                       
                swap(pointer_1,pointer_2);
        }
        printf("%d,%d",*pointer_1,*pointer_2);
}

void swap(int *x,int *y)
{
        int *c;
        printf("iiiiii");
        c=x;
        x=y;
        y=c;
}
最佳答案
2020-3-22 11:21:37
本帖最后由 就是要努力呀 于 2020-3-22 11:29 编辑
青青兮云 发表于 2020-3-22 11:07
谢谢您的解答,我明白您说的意思,在子函数中改变主函数的元素,需要传入元素的指针,为什么不用指针的时 ...


子函数里的值是形参,形参是一个独立的参数(相当于你在子函数里面定义了一个和实参一样类型一样值的变量),它当然可以自由更改,但是它的更改并不会影响到实参
子函数可以对主函数里的元素进行操作,但是必须用到指针
你要是真的明白了,就不会在这个问题上纠结
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-19 21:30:54 | 显示全部楼层
你只是调换了里面的值,并没有将调换完的值返回出去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 22:07:48 | 显示全部楼层
#include <stdio.h>
void swap(int *a, int *b);

void main()
{
        int a, b;
        
        int *pointer_1, *pointer_2;
        scanf("%d,%d", &a, &b);
        pointer_1 = &a;
        pointer_2 = &b;
        if (a < b)
        {
                swap(pointer_1, pointer_2);
        }
        printf("%d,%d", *pointer_1, *pointer_2);
}

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

使用道具 举报

发表于 2020-3-19 22:18:55 | 显示全部楼层
你可以着重了解一下传值和传址的关系
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-20 09:57:58 | 显示全部楼层

       代码我知道,我不明白的是为什么在swap中我交换pointer_1和pointer_2的地址不能实现pointer_1和pointer_2的地址交换。我把他们合成一个函数的时候,就可以采用一个中间指针变量*c来完成,分为俩函数就不行了。我想通过交换pointer_1和2的值来改变它们指向的变量。不是像小甲鱼那样直接对它们指向的变量进行交换。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-20 10:05:06 | 显示全部楼层
bin554385863 发表于 2020-3-19 22:18
你可以着重了解一下传值和传址的关系

我看了,网上没有详细的说明,有也是和我这个不太相关的,我把这两个函数合成一个,定义一个中间指针变量*p,完成pointer_1和2的值的交换,可以运行。但是,我分开写,在自定义函数中交换它们的值就不行,我调试的时候发现swap执行了,但是出来swap函数没什么变化。我想交换pointer_1和2的值来改变它们指向的变量。标准答案上楼的老哥发出来了,那是通过交换指针变量指向的变量的值来操作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-20 10:07:25 | 显示全部楼层
qiuyouzhi 发表于 2020-3-19 21:30
你只是调换了里面的值,并没有将调换完的值返回出去

我就是想调换pointer_1和pointer——2的值啊,这种函数不需要返回值吧,如果我定义的swap函数要返回值,那我应该返回多少,,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-20 10:16:20 | 显示全部楼层
青青兮云 发表于 2020-3-20 10:07
我就是想调换pointer_1和pointer——2的值啊,这种函数不需要返回值吧,如果我定义的swap函数要返回值, ...

需要的。。。
要不然调换的只有x和y的值,a和b不变
建议别用函数了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-20 17:02:20 | 显示全部楼层
青青兮云 发表于 2020-3-20 09:57
代码我知道,我不明白的是为什么在swap中我交换pointer_1和pointer_2的地址不能实现pointer_1和po ...

你想实现指针的交换,是不是应该取指针的指针,然后进行交换?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-21 19:07:40 | 显示全部楼层
4goodworld 发表于 2020-3-20 17:02
你想实现指针的交换,是不是应该取指针的指针,然后进行交换?

我想实现指针值的交换来改变指针指向的变量,这种方法在main函数中能用,我把交换指针值的操作定义了一个函数,void swap(int *p1,int *p2),在main中调用它,结果是俩指针的值没有交换。程序的确运行了这个函数,但是没作用,我调试也不懂怎么回事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-21 19:14:40 | 显示全部楼层
青青兮云 发表于 2020-3-21 19:07
我想实现指针值的交换来改变指针指向的变量,这种方法在main函数中能用,我把交换指针值的操作定义了一个 ...

难道我还没说清楚吗?
你要“实现指针值的交换来改变指针指向的变量”
指针所存在的值所对应的内存地址是通过指针的指针来获得的,还不理解吗?
一个int型,要实现它的变量交换,需要int*参与
一个int*型,要实现它的变量交换,那就需要int**参与
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-21 19:29:01 | 显示全部楼层
4goodworld 发表于 2020-3-21 19:14
难道我还没说清楚吗?
你要“实现指针值的交换来改变指针指向的变量”
指针所存在的值所对应的内存地址 ...

抱歉,你说的我还是没听懂,,,我交换指针变量的值还得再定义指针?int *p,是定义指针变量,在语句中写下*p代表的不是指针变量p所指的变量值吗,我在main里直接交换指针变量的值可以实现功能,为什么到了我构造的函数中就不行了。谢谢你的多次解答,奈何我是学电子的编程小白,c算是零基础,目前学完指针了,但很多机器内部运作的原理我并不清楚,有时候可能会出现语法逻辑没错,但是就是不对的情况。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-21 20:06:22 | 显示全部楼层
青青兮云 发表于 2020-3-21 19:29
抱歉,你说的我还是没听懂,,,我交换指针变量的值还得再定义指针?int *p,是定义指针变量,在语句中写 ...
#include <stdio.h>
void swap(int **a, int **b);

void main()
{
        int a, b;

        int *pointer_1, *pointer_2;
        scanf("%d,%d", &a, &b);
        pointer_1 = &a;
        pointer_2 = &b;
        if (a < b)
        {
                swap(&pointer_1, &pointer_2);
        }
        printf("%d,%d", *pointer_1, *pointer_2);
}

void swap(int **x, int **y)
{
        int* c;
        c = *x;
        *x = *y;
        *y = c;
}
指针交换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 09:24:47 | 显示全部楼层


[code]#include <stdio.h>


void main()
{
        int a, b;

        int *pointer_1, *pointer_2,*c;
        scanf("%d,%d", &a, &b);
        pointer_1 = &a;
        pointer_2 = &b;
        if (a < b)
        {
                        c=pointer_1;
                        pointer_1=pointer_2;
                        pointer_2=c;
        }
        printf("%d,%d", *pointer_1, *pointer_2);
}


再次麻烦老哥,谢谢你的回复。你发的代码我好像明白了,定义一个指针变量的指针,通过指针的指针来改便指针的值,是吗。上面这段代码是我直接交换指针的值,我把指针变量当作变量一样通过中间变量来操作。问题是为什么一个函数的条件下能行,分成俩函数运行不了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 09:28:48 | 显示全部楼层
本帖最后由 青青兮云 于 2020-3-22 09:29 编辑


#include <stdio.h>
void swap(int *a, int *b);

void main()
{
        int a, b;

        int *pointer_1, *pointer_2;
        scanf("%d,%d", &a, &b);
        pointer_1 = &a;
        pointer_2 = &b;
        if (a < b)
        {
                        swap(&pointer_1, &pointer_2);
        }
        printf("%d,%d", *pointer_1, *pointer_2);
}
void swap(int *x, int *y)
{
        int* c;
        c = x;
        x = y;
        y = c;
}



这是·分成俩函数的,我实在看不出哪不一样,请大神指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 10:23:45 | 显示全部楼层
在子函数中改变main数中的元素,应该传入那个元素的指针,你想在swap函数中改变指针的指向,就应该传入指针的指针
#include <stdio.h>
void main()
{
        int a,b;
        void swap(int *a,int *b);
        int *pointer_1,*pointer_2;
        scanf("%d,%d",&a,&b);
        pointer_1=&a;               
        pointer_2=&b;       
        if(a<b)                       
        {                       
                swap(&pointer_1,&pointer_2);
        }
        printf("%d,%d",*pointer_1,*pointer_2);
}

void swap(int **x,int **y)

我没有对你的swap函数的对错进行分析,因此里面的内容就不发了,自己理解着写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 11:07:54 | 显示全部楼层
就是要努力呀 发表于 2020-3-22 10:23
在子函数中改变main数中的元素,应该传入那个元素的指针,你想在swap函数中改变指针的指向,就应该传入指针 ...

谢谢您的解答,我明白您说的意思,在子函数中改变主函数的元素,需要传入元素的指针,为什么不用指针的时候就可以直接在子函数中实现俩元素的值的变化,子函数不能对主函数中的元素进行操作吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 11:16:37 | 显示全部楼层
这个东西你要明白,指针是一个变量,它也有地址和内存空间,在函数调用过程中它也是通过拷贝进行传递的(也就是传值),你可以在swap中分别打印pointer1 和 x的地址你就知道了,它两是两个不同的变量,只不过它们同时指向同一个地址而已,你在函数里只改变来x和y的指向,poniter1和pointer2的指向是没有改变的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 11:21:37 | 显示全部楼层    本楼为最佳答案   
本帖最后由 就是要努力呀 于 2020-3-22 11:29 编辑
青青兮云 发表于 2020-3-22 11:07
谢谢您的解答,我明白您说的意思,在子函数中改变主函数的元素,需要传入元素的指针,为什么不用指针的时 ...


子函数里的值是形参,形参是一个独立的参数(相当于你在子函数里面定义了一个和实参一样类型一样值的变量),它当然可以自由更改,但是它的更改并不会影响到实参
子函数可以对主函数里的元素进行操作,但是必须用到指针
你要是真的明白了,就不会在这个问题上纠结
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 11:40:50 | 显示全部楼层
就是要努力呀 发表于 2020-3-22 11:21
子函数里的值是形参,形参是一个独立的参数(相当于你在子函数里面定义了一个和实参一样类型一样值的变 ...

我好像明白了,用指针的时候形参值也是变量的地址也指向变量,所以可以在子函数改变变量的值,但是子函数中不能改变主函数中变量的值。是吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 17:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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