函数指针的问题
下面是一段代码:#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:
因为这是传值 , 你应该用传址 1. 你给人家一张照片,人家给照片画上胡子,你会长胡子吗?人家把照片撕了,你会挂掉吗?
2. 调用swa(x,y);的时候
void swa(int a,int b)
{
//...
}
无论swa函数内部如何写,x就相当于你,a就相当于你的照片。所以不用看函数的实现都知道,无论函数如何处理a,都只是在处理x的照片,这样是不可能改变x的;同理y也不会被改变。 要么加个返回值 要么加个全局变量 仰望天上的光 发表于 2015-4-13 17:40
1. 你给人家一张照片,人家给照片画上胡子,你会长胡子吗?人家把照片撕了,你会挂掉吗?
2. 调用swa(x,y) ...
:lol::lol::lol:谢谢啦好生动!!!! 要传指针哦 仰望天上的光 发表于 2015-4-13 17:40
1. 你给人家一张照片,人家给照片画上胡子,你会长胡子吗?人家把照片撕了,你会挂掉吗?
2. 调用swa(x,y) ...
会不会为a, b分配内存空间呢?
a,b其实就是swap里的局部变量吧 仰望天上的光 发表于 2015-4-13 17:40
1. 你给人家一张照片,人家给照片画上胡子,你会长胡子吗?人家把照片撕了,你会挂掉吗?
2. 调用swa(x,y) ...
阁下一看就是真懂!说的很生动,楼主肯定明白了~ Victory_6226 发表于 2015-4-14 20:55
会不会为a, b分配内存空间呢?
a,b其实就是swap里的局部变量吧
照片自然也是要占据存储空间的,只是照片占据的空间和本体占据的空间是完全不同的两个空间。
照片和本体之间的联系仅仅在于调用函数的瞬间,照片和本体的值相同,这也是C语言函数参数传递叫做“值传递”的原因 我就是来看看 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 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");
}
支持小甲鱼!!!!!!!!!!!1 导电性heart 发表于 2015-4-14 16:02
谢谢啦好生动!!!!
生动形象啊!!!支持 本帖最后由 haiouda 于 2015-4-16 20:51 编辑
前以概述~~~~~~
只因函数的参数是单向传递的(不可逆),所以楼主在子函数中的操作返回到主函数时无效;除非把printf()写到子函数中{:1_1:}
或者用取地址的方式,对地址里的值进行操作(即向上面各位大侠们的作法),因为是对地址内容的操作,所以在主函数中(主函数中各变量的地址没有改变,而地址里的值却由子函数进行了更改),子函数的操作依然有效。
吾只是画蛇添足 :ton:
页:
[1]