免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: flyszh
打印 上一主题 下一主题

[函数] 为什么我的指针函数返回的值不对? [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
11 [报告]
发表于 2004-12-29 10:14 |只看该作者

为什么我的指针函数返回的值不对?

static int a;

论坛徽章:
0
12 [报告]
发表于 2004-12-29 10:40 |只看该作者

为什么我的指针函数返回的值不对?

我是从java往c++转,在java中这些都不是问题,可是到了c++就不是那么回事啦^_^,见笑。

static是个好东西!

论坛徽章:
0
13 [报告]
发表于 2004-12-29 16:07 |只看该作者

为什么我的指针函数返回的值不对?

TO flyszh:
最好不要强迫你的程序做它不该做的事情。
在这里,用 static 实现你的“需求”是自找麻烦。假如你多次调用这个函数,几乎不可能得到正确的结果。
在c/c++里,遇到这样的情况,一般是传“指针”或者“引用”进去。

如果你一定要在函数内定义一个变量并且把它的地址传出去,那就最好是在堆里“new”一个。并且,写好注释,要求(并且祈祷)调用它的程序员记得自己释放内存。

java里并不是没有这种问题。java里的对象都是new出来的,都在堆中。你平时所用的对象的引用,实际上都相当于“指针”。只不过,它不用你自己来管理内存。
在java里,如果你想在方法里定义一个原生类型变量,如int。除非把它“装箱”,不然肯定是传不出它的地址。

在c/c++和java里,讨论这个问题最经典的例子,还是那个 swap(int a, int b)。
你有办法在java里,写一个swap(int a, int b),用来交换变量a,b的值吗?:)

论坛徽章:
0
14 [报告]
发表于 2004-12-29 16:16 |只看该作者

为什么我的指针函数返回的值不对?

原帖由 "精简指令" 发表:
TO flyszh:
最好不要强迫你的程序做它不该做的事情。
在这里,用 static 实现你的“需求”是自找麻烦。假如你多次调用这个函数,几乎不可能得到正确的结果。
在c/c++里,遇到这样的情况,一般是传“指针”或者“..........


欺负JAVA不能直接操纵内存

论坛徽章:
0
15 [报告]
发表于 2004-12-29 16:29 |只看该作者

为什么我的指针函数返回的值不对?

原帖由 "flyszh" 发表:
我是从java往c++转,在java中这些都不是问题,可是到了c++就不是那么回事啦^_^,见笑。

static是个好东西!

java是什么东西,用来干什么的呀,它为什么叫java呢?         

论坛徽章:
0
16 [报告]
发表于 2004-12-29 16:32 |只看该作者

为什么我的指针函数返回的值不对?

xiaxiaxiaxia,难啊

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
17 [报告]
发表于 2004-12-29 16:34 |只看该作者

为什么我的指针函数返回的值不对?

[quote]原帖由 "killam"]getP(100),100是随机给定的,这部分内存可能会被修改,建议不要给随机数,用变量替换。[/quote 发表:


^_^,用啥都是一样地,都要压栈地。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
18 [报告]
发表于 2004-12-29 16:38 |只看该作者

为什么我的指针函数返回的值不对?

原帖由 "精简指令" 发表:
TO flyszh:
最好不要强迫你的程序做它不该做的事情。
在这里,用 static 实现你的“需求”是自找麻烦。假如你多次调用这个函数,几乎不可能得到正确的结果。
在c/c++里,遇到这样的情况,一般是传“指针”或者“..........


嗯,绝对nod。

总之一句话,C/C++里,尤其是C,你必须自己收拾内存。^_^,不像java之类的,有个GC保姆,你专心做大生意就好了。哈哈。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
19 [报告]
发表于 2004-12-29 16:43 |只看该作者

为什么我的指针函数返回的值不对?

原帖由 "精简指令" 发表:
TO flyszh:
在这里,用 static 实现你的“需求”是自找麻烦。假如你多次调用这个函数,几乎不可能得到正确的结果。


这是为什么?什么地方会出错呢?static要省着点用倒是听说过,会出错就不明白了,愿闻其详!

论坛徽章:
0
20 [报告]
发表于 2004-12-29 17:24 |只看该作者

为什么我的指针函数返回的值不对?

如果用这个例子说明的话……
int* getP() 到底是用来做什么的呢?
假如是为了每次都返回一个固定的点,并且允许调用者直接修改返回结果,影响下次调用返回的点的值,就可以直接这样修改:
  1. #include <iostream>;

  2. int *getP()
  3. {
  4.   static int a = 100;

  5.   return  & a;
  6. }
复制代码


如果作者的目的只是希望在某个时候,可以修改返回结果所指向的内存,而多次调用都返回相同的点值,就应该该为:
  1. #include <iostream>;

  2. int *getP()
  3. {
  4.   static int a;
  5.   a = 100;
  6.   return & a;
  7. }
复制代码


假如程序稍微复杂一些,就可能导致混淆。
假如在定义一些类方法的时候,使用这样的技巧,就更加容易出错。
在某些极端的情况下,几乎根本就写不对,比如:

  1. class rational
  2. {
  3.     ……
  4. };

  5. inline const rational& operator*(const rational& lhs,
  6.                                  const rational& rhs)
  7. {
  8.   static rational result;      // 将要作为引用返回的
  9.                                // 静态对象

  10.   lhs和rhs 相乘,结果放进result;

  11.   return result;
  12. }
复制代码


在下面代码中调用:

  1. bool operator==(const rational& lhs,      // rationals的operator==
  2.                 const rational& rhs);     //

  3. rational a, b, c, d;


  4. if ((a * b) == (c * d)) {

  5.   处理相等的情况;

  6. } else {

  7.   处理不相等的情况;

  8. }
复制代码


上面的例子摘自〈effective c++〉。在任何情况下,if语句永远为true。

如果一个大型程序里布满这样的函数,对谁都是噩梦。:(
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP