鱼C论坛

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

函数指针的问题

[复制链接]
发表于 2015-4-13 14:33:55 | 显示全部楼层 |阅读模式

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

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

x
下面是一段代码:
#include <stdio.h>

void swa(int a,int b)
{
    int tmp;
    tmp=a;
    a=b;
    b=tmp;
}

void main()
{
   int x,y;
   printf("请输入两个数:\n");
   scanf("%d",&x);
   scanf("%d",&y);
   swa(x,y);
   printf("x=%d\n",x);
   printf("y=%d\n",y);
}
有大神能给解答一下为什么这段代码不能实现两个数字的互换呢?谢谢!!!:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-13 14:37:21 | 显示全部楼层
因为这是传值   , 你应该用传址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-13 17:40:26 | 显示全部楼层
1. 你给人家一张照片,人家给照片画上胡子,你会长胡子吗?人家把照片撕了,你会挂掉吗?
2. 调用swa(x,y);的时候
void swa(int a,int b)
{
   //...
}
无论swa函数内部如何写,x就相当于你,a就相当于你的照片。所以不用看函数的实现都知道,无论函数如何处理a,都只是在处理x的照片,这样是不可能改变x的;同理y也不会被改变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2015-4-13 23:01:32 | 显示全部楼层
要么加个返回值 要么加个全局变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-14 16:02:02 | 显示全部楼层
仰望天上的光 发表于 2015-4-13 17:40
1. 你给人家一张照片,人家给照片画上胡子,你会长胡子吗?人家把照片撕了,你会挂掉吗?
2. 调用swa(x,y) ...

:lol::lol::lol:谢谢啦  好生动!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-14 17:02:58 | 显示全部楼层
要传指针哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-14 20:55:46 | 显示全部楼层
仰望天上的光 发表于 2015-4-13 17:40
1. 你给人家一张照片,人家给照片画上胡子,你会长胡子吗?人家把照片撕了,你会挂掉吗?
2. 调用swa(x,y) ...

会不会为a, b分配内存空间呢?
a,b其实就是swap里的局部变量吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-14 22:57:55 | 显示全部楼层
仰望天上的光 发表于 2015-4-13 17:40
1. 你给人家一张照片,人家给照片画上胡子,你会长胡子吗?人家把照片撕了,你会挂掉吗?
2. 调用swa(x,y) ...

阁下一看就是真懂!说的很生动,楼主肯定明白了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-14 22:57:59 | 显示全部楼层
Victory_6226 发表于 2015-4-14 20:55
会不会为a, b分配内存空间呢?
a,b其实就是swap里的局部变量吧

照片自然也是要占据存储空间的,只是照片占据的空间和本体占据的空间是完全不同的两个空间。
照片和本体之间的联系仅仅在于调用函数的瞬间,照片和本体的值相同,这也是C语言函数参数传递叫做“值传递”的原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-15 11:08:40 | 显示全部楼层
我就是来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-15 21:50:26 | 显示全部楼层
1.这个问题是属于函数参数传递的问题,而不是函数指针,函数指针是 void (*p)()  这里的p变量的问题,
2.回答前提有很多种,假设以知道指针为前提,你给的是指针上的值的问题,假设你不知道指针为前提,你传达的是一份被复制的值
3.假设你知道指针:假设你传的是指针的值,那么会复制指针的值,&a,那么你使用被拷贝好的值的指向内存空间的值 *a,这里的 a == &a   (这里是引用 a 指向的内存,并不是 a 本身)
4.假设你不知道指针:假设你传的是本身的值,那么会复制背身的值,a,那么你使用的是另外一份变量,b.这里 a == b (这里引用 b 本身)                         附上一个比较有趣的程序来说明.个人很喜欢这个小程序
#include <stdio.h>

                        void Vid(int Q,int p)
                        {
                                printf("%d,%d",Q,p); 
                        }
                        void D(void (* p)())
                        {
                                p(122,p);
                        }
                        int main()
                        {
                                int d;
                                
                                printf("%d\n",Vid);
                                //输入 Vid 的值给 d ,你会发现同样可以执行并且调用到 Vid 函数
                                scanf("%d",&d);
                                D((void (* )())d);
                                return 0;
                        }



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

使用道具 举报

发表于 2015-4-15 21:54:14 | 显示全部楼层
本帖最后由 myqicq 于 2015-4-15 22:29 编辑

#include <stdio.h>
void swa(int* a,int* b)
{
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}

void main()
{
    int x,y;
    void (*pswa) (int* a, int* b); //声明一个函数的指针,返回类型,形参与swa函数一样.
    pswa = swa;
    printf("请输入两个数:\n");
    scanf("%d",&x);
    scanf("%d",&y);
    pswa(&x,&y);                                        //调用函数的指针
    printf("x=%d\n",x);
    printf("y=%d\n",y);
    system("pause");  
}

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

使用道具 举报

发表于 2015-4-16 18:08:05 | 显示全部楼层
支持小甲鱼!!!!!!!!!!!1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-16 18:10:28 | 显示全部楼层
导电性heart 发表于 2015-4-14 16:02
谢谢啦  好生动!!!!

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

使用道具 举报

发表于 2015-4-16 20:46:13 | 显示全部楼层
本帖最后由 haiouda 于 2015-4-16 20:51 编辑

前以概述~~~~~~

只因函数的参数是单向传递的(不可逆),所以楼主在子函数中的操作返回到主函数时无效;除非把printf()写到子函数中{:1_1:}

或者用取地址的方式,对地址里的值进行操作(即向上面各位大侠们的作法),因为是对地址内容的操作,所以在主函数中(主函数中各变量的地址没有改变,而地址里的值却由子函数进行了更改),子函数的操作依然有效。

吾只是画蛇添足 :ton:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 22:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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