鱼C论坛

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

哪里错了?

[复制链接]
发表于 2013-3-28 09:31:38 | 显示全部楼层 |阅读模式
1鱼币
  1. #include <stdio.h>
  2. void fun(int a,int b)
  3. { int t;
  4.   t=a; a=b; b=t;
  5. }
  6. main()
  7. { int c[10]={1,2,3,4,5,6,7,8,9,0},i;
  8.   for(i=0;i<10;i+=2) fun(c[i],c[i+1]);
  9.   for(i=0;i<10;i++) printf("%d,",c[i]);
  10.   printf("\n");
  11. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-28 09:47:03 | 显示全部楼层
楼主这是要干嘛呢?函数参数以值传递时的规则是:实参可以改变形参的值,但是形参的值是不能改变实参的值的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-28 10:19:05 | 显示全部楼层
楼主函数想要实现交换a、b的值的功能吧,可这个函数有问题,你的用指针来解决。
书上有现成的例子,就不给你打了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-28 14:01:27 | 显示全部楼层
用引用~你这个交换不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-29 08:26:13 | 显示全部楼层
本帖最后由 L]V[G 于 2013-4-4 09:55 编辑

你应该还没有理解,在c语言中如果想通过调用子函数来改变主函数的值,而且返回一个以上的值,应该使用指针,即 址传递,你使用的方法是值传递,只是把实参的值给了形参,在子函数的过程中,系统临时给形参分配了内存空间,但是一旦子函数结束,返回主函数,那么形参所占的内存空间值就会被释放掉,而无法改变主函数的值。


PS: 提醒一下,以后你发函数的时候,要使用英文格式,特别是标点符号!!!刚才复制了你的程序,差点一口鲜血喷在屏幕上,标点都用错了,只好自己重新打一个,还有要注意程序的风格,这个小甲鱼视屏也有提及。也得感谢你,正在在学指针,给我个机会练练手


下面我给你两个我敲的程序,是我早上起来敲的,有些注释的,要理解好指针,指针其实不难,只是绕了很多圈,要静下心来,慢慢的想,慢慢的出错,慢慢的解决。
  1. //时间:2013年3月29日 07:55:14
  2. //功能:把一个数组的基数位的元素和相邻的偶数位的元素调换
  3. #include<stdio.h>

  4. void fun(int * p, int n); //函数声明

  5. int main()
  6. {  
  7.     int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
  8.     int i;
  9.    
  10.     for(i=0; i<10; ++i)   //输原来的数组
  11.     {
  12.         printf("%-4d", a[i]);
  13.     }
  14.     printf("\n");
  15.    
  16.    
  17.     fun(a, 10);  //调用函数,把数组的基数位的元素和相邻的偶数位的元素调换
  18.    
  19.     for(i=0; i<10; ++i)   //输出改变后数组
  20.     {
  21.         printf("%-4d", a[i]);
  22.     }
  23.    
  24.     printf("\n");
  25.    
  26.     return 0;
  27. }

  28. void fun(int * p, int n)  //使用指针传递的方法
  29. {   
  30.     int i, t;
  31.    
  32.     for(i=0; i<n; i+=2, p+=2)
  33.     {
  34.         t = *p;
  35.         *p = *(p+1);
  36.         *(p+1) = t;
  37.     }   
  38. }


  39. /*****************************************

  40.   在vc++6.0上输出的结果为:
  41.   1   2   3   4   5   6   7   8   9   0
  42.   2   1   4   3   6   5   8   7   0   9
  43.   Press any key to continue
  44.   
  45. *******************************************/
复制代码

  1. #include<stdio.h>

  2. void fun(int *q); //函数声明

  3. int main()
  4. {  
  5.     int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
  6.     int i;
  7.     int * p = NULL;
  8.    
  9.     for(i=0; i<10; ++i)   //输原来的数组
  10.     {
  11.         printf("%-4d", a[i]);
  12.     }
  13.     printf("\n");
  14.    
  15.     p = a; //p保存的是a数组的地址
  16.     for(i=0; i<10; i+=2) //调用函数
  17.     {
  18.         fun(p+i);  
  19.     }
  20.    
  21.     for(i=0; i<10; ++i)   //输出改变后数组
  22.     {
  23.         printf("%-4d", a[i]);
  24.     }
  25.    
  26.     printf("\n");
  27.    
  28.     return 0;
  29. }

  30. void fun(int *q)  //使用指针传递的方法
  31. {   
  32.     int i, t;
  33.    
  34.     t = *q;
  35.     *q = *(q+1);
  36.     *(q+1) = t;
  37. }


  38. /*****************************************

  39.   在vc++6.0上输出的结果为:
  40.   1   2   3   4   5   6   7   8   9   0
  41.   2   1   4   3   6   5   8   7   0   9
  42.   Press any key to continue
  43.   
  44. *******************************************/
复制代码


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

使用道具 举报

发表于 2013-3-29 16:14:38 | 显示全部楼层
楼上几位说的都对,我也不说了,这种方法的实现只能通过指针。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-29 17:30:35 | 显示全部楼层
a,b改变了、c[i]和c[i+1]又不会发生改变、
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-29 18:59:28 | 显示全部楼层
实参和形参的问题...把数组定义成全局变量应该就可以...C里面我最怕调用函数就因为这个...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-1 22:50:37 | 显示全部楼层
用指针传递就能改变两个数的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-1 23:01:05 | 显示全部楼层
楼主写的好像有矛盾吧.........
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-3 18:25:59 | 显示全部楼层
淡定,淡定,淡定……真是好贴啊……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-3 21:13:37 | 显示全部楼层
楼主加油,鱼C加油!我们都看好你哦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-4 00:48:33 | 显示全部楼层

定义指针时, int *p=NULL ; 否则容易发生未定义行为,不是一种好的习惯.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-4 09:53:44 | 显示全部楼层
坦_然 发表于 2013-4-4 00:48
定义指针时, int *p=NULL ; 否则容易发生未定义行为,不是一种好的习惯.

谢谢提醒哈,我会记住的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-30 23:12:46 | 显示全部楼层
这个应该用指针,用形参瞎折腾是不行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-27 02:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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