导电性heart 发表于 2015-4-13 14:33:55

函数指针的问题

下面是一段代码:
#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:

小人 发表于 2015-4-13 14:37:21

因为这是传值   , 你应该用传址

仰望天上的光 发表于 2015-4-13 17:40:26

1. 你给人家一张照片,人家给照片画上胡子,你会长胡子吗?人家把照片撕了,你会挂掉吗?
2. 调用swa(x,y);的时候
void swa(int a,int b)
{
   //...
}
无论swa函数内部如何写,x就相当于你,a就相当于你的照片。所以不用看函数的实现都知道,无论函数如何处理a,都只是在处理x的照片,这样是不可能改变x的;同理y也不会被改变。

l605361413 发表于 2015-4-13 23:01:32

要么加个返回值 要么加个全局变量

导电性heart 发表于 2015-4-14 16:02:02

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

:lol::lol::lol:谢谢啦好生动!!!!

安静百合 发表于 2015-4-14 17:02:58

要传指针哦

Victory_6226 发表于 2015-4-14 20:55:46

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

会不会为a, b分配内存空间呢?
a,b其实就是swap里的局部变量吧

826438987 发表于 2015-4-14 22:57:55

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

阁下一看就是真懂!说的很生动,楼主肯定明白了~

仰望天上的光 发表于 2015-4-14 22:57:59

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

照片自然也是要占据存储空间的,只是照片占据的空间和本体占据的空间是完全不同的两个空间。
照片和本体之间的联系仅仅在于调用函数的瞬间,照片和本体的值相同,这也是C语言函数参数传递叫做“值传递”的原因

微笑看世界 发表于 2015-4-15 11:08:40

我就是来看看

QQ[我在线上] 发表于 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;
                        }



myqicq 发表于 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");
}

Johnny_sunshine 发表于 2015-4-16 18:08:05

支持小甲鱼!!!!!!!!!!!1

Johnny_sunshine 发表于 2015-4-16 18:10:28

导电性heart 发表于 2015-4-14 16:02
谢谢啦好生动!!!!

生动形象啊!!!支持

haiouda 发表于 2015-4-16 20:46:13

本帖最后由 haiouda 于 2015-4-16 20:51 编辑

前以概述~~~~~~

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

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

吾只是画蛇添足 :ton:
页: [1]
查看完整版本: 函数指针的问题