免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3394 | 回复: 12
打印 上一主题 下一主题

初学如何加深对指针做行参的理解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-04 14:09 |只看该作者 |倒序浏览
由于书上只简单说运用指针变量做行参能改变主调函数的直,说什么值传递,但并未怎么解释,至少没明着说

清楚,让我们这些新手很困惑,看完书后总结了下子,说点,请大哥大姐帮忙看看说错了没:

==================
如下例

  1. #include <stdio.h>

  2. void change(int *, int *);

  3. int main(int argc, char *argv[])
  4. {

  5.         int i=190, j=101;
  6.        
  7.         change(&i, &j);
  8.         printf("i=%d\nj=%d\n", i, j);
  9.        
  10.         return 0;
  11. }

  12. void change(int *a, int *b)
  13. {
  14.         int tmp;
  15.         if(*a>*b)
  16.         {
  17.                 tmp = *a;
  18.                 *a   = *b;
  19.                 *b   = tmp;
  20.         }
  21. }

复制代码

[1]如果单把值拷贝给行参,在被调函数中被交换的只是行参的值,不会对实参产生影响;

[2]而我们拷贝实参的地址给行参,在被调函数里被交换的虽然还是行参,但现在行参已经带上了那个地址,
所以此时交换了内存中实际的地址,那么存在那个地址中的实参也不得不随地址而变,
因为内存中地址是唯一的(对吗?)

[3]而为什么要用指针变量做参数,我想是不得以了,因为存放地址就要用指针变量了,就顺理成章了,想书上直接说这样能改变很没条理,而且你看*a=*b,实际上就是"j=i;", 前者不仅速度慢而且目的不明。但由于指针是变量, 我们可以通过改变它们的指向, 以间接访问不同的变量, 这给程序员带来灵活性, 也使程序代码编写得更为简洁和有效。


说得不好,请大家评评吧,谢谢

[ 本帖最后由 wodetian 于 2007-2-4 14:15 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-02-04 15:54 |只看该作者
呵,刚学,就来个总结了. 除了第1点什么错误外,另2点都是错误的。建议你还多理解和消化

论坛徽章:
0
3 [报告]
发表于 2007-02-04 16:16 |只看该作者
原帖由 mik 于 2007-2-4 15:54 发表
呵,刚学,就来个总结了. 除了第1点什么错误外,另2点都是错误的。建议你还多理解和消化

希望楼上的大哥纠正一下啦,拜托拜托

论坛徽章:
0
4 [报告]
发表于 2007-02-04 16:30 |只看该作者
--

关于 C 语言的函数调用,有一点容易让人产生混淆,尤其是对于那些曾经使用 Fortran 或者类似程序设计语言的程序员:在 C 中,所有的函数参数都是只传值的。这句话的意思是,被调用的函数都是在临时的变量中得到参数的,而不是原来的那些。这就使得 C 区别于那些 “传递引用” 的编程语言,比如 Fortran,或者 Pascal (var 类型参数),等等。在参数传引用的编程语言中,被调用的过程得到的是参数的原身,而不是经过复制的版本。


"The C Programming Language" 第二版 1.8 节,有改动

--

论坛徽章:
0
5 [报告]
发表于 2007-02-04 16:36 |只看该作者
被调用的过程得到的是参数的原身,而不是经过复制的版本,引用的本质是什么呢?我的感觉就是把地址值复制给行参

论坛徽章:
0
6 [报告]
发表于 2007-02-04 16:39 |只看该作者
地址是另外加的,这个地址不也是一个值吗?

论坛徽章:
0
7 [报告]
发表于 2007-02-04 16:44 |只看该作者
--

算了,我翻译的可能有很多错误,还是贴原文吧。

One aspect of C functions may be unfamiliar to programmers who are used to some other languages, particularly Fortran. In C, all function arguments are passed "by value." This means that the called function is given the values of its arguments in temporary variables rather than the originals. This leads to some different properties than are seen with "call by reference" languages like Fortran or with var parameters in Pascal, in which the called routine has access to the original argument, not a local copy.


--

论坛徽章:
0
8 [报告]
发表于 2007-02-04 16:46 |只看该作者
指针作为被调函数的形参时,被调函数可以改变形参指针变量所指变量的值,
但是不能改变行参指针变量的值。

论坛徽章:
0
9 [报告]
发表于 2007-02-04 16:49 |只看该作者
在 K&R 的这本书上,此问题被阐释得非常清楚,可以看看。

论坛徽章:
0
10 [报告]
发表于 2007-02-04 16:54 |只看该作者
原帖由 daworld 于 2007-2-4 16:46 发表
指针作为被调函数的形参时,被调函数可以改变形参指针变量所指变量的值,
但是不能改变行参指针变量的值。

行参也变的,只是变完就销毁了,到再次调用还是原来的;

感觉怪哦,行参没有外界复制来,或者默认值,哪来具体的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP