A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ★彬★卍囧神 中级黑马   /  2014-5-25 16:52  /  1319 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ★彬★卍囧神 于 2014-5-25 17:20 编辑
  1. //分析输出结果
  2. #import <Foundation/Foundation.h>
  3. @interface Person : NSObject
  4. {
  5.     @public
  6.     int age;
  7.     double height;
  8. }
  9. - (void)print;
  10. @end

  11. void test1(int newAge, double newHeight);
  12. void test2(Person *newP);
  13. void test3(Person *newP);
  14. void test4(Person *newP);

  15. int main()
  16. {
  17.     Person *p = [Person new];
  18.     p->age = 10;
  19.     p->height = 1.5f;
  20.    
  21.     test1(p->age, p->height);
  22.     [p print];
  23.    
  24.     test2(p);
  25.     [p print];
  26.    
  27.     test3(p);
  28.     [p print];
  29.    
  30.     test4(p);
  31.     [p print];
  32.    
  33.     return 0;
  34. }

  35. @implementation Person
  36. - (void)print
  37. {
  38.     NSLog(@"年龄=%d,身高=%f", age, height);
  39. }
  40. @end

  41. void test1(int newAge, double newHeight)
  42. {
  43.     newAge = 10;
  44.     newHeight = 1.6;
  45. }

  46. void test2(Person *newP)
  47. {
  48.     newP->age = 20;
  49.     newP->height = 1.7;
  50. }

  51. void test3(Person *newP)
  52. {
  53.     Person *p2 = [Person new];
  54.     p2->age = 40;
  55.     p2->height = 1.8;
  56.     newP = p2;//求分析下这里
  57.    
  58.     newP->age = 30;
  59. }

  60. void test4(Person *newP)
  61. {
  62.     Person *p2 = newP;
  63.     p2->age = 50;
  64.     p2->height = 1.9;
  65.     newP->age = 60;
  66. }
复制代码
年龄=10,身高=1.500000
年龄=20,身高=1.7000000
年龄=20,身高=1.7000000  //请问这里为什么不是 年龄=30,身高=1.700000
年龄=60,身高=1.900000

3 个回复

倒序浏览
本帖最后由 m573555543 于 2014-5-25 17:34 编辑

  • void test3(Person *newP)
  • {
  • // 新建一个p2 对象
  • Person *p2 = [Person new];
  • // 给新建对象p2中的成员变量age赋值为40;
  •     p2->age = 40;
  • // 给新建对象 p2中的成员变量height赋值为40;
  •     p2->height = 1.8;
  • // 别的函数调用都是直接 newP->age = 20; 而这个则是在函数里面新建了一个p2的对象
  • // 现在让新建对象p2 等于 newp ,当这个代码块结束的时候,新建对象p2的生命周期被回收。

  •     newP = p2;//求分析下这里
  •     // 现在不管怎么写,改变的都是p2这个对象里面的值,而不是你原先定义的对象里面的值。
  •     newP->age = 30;
  • }

回复 举报
void test3(Person *newP)  //这里是根本原因,这里的newP是局部变量,当你 test3(p)的时候,把p的地址付给
{                                     //newP,这事newP和p指向同一个内存空间
    Person *p2 = [Person new];
    p2->age = 40;
    p2->height = 1.8;
    newP = p2;//求分析下这里      你这里的意思是,将p2指向的内存区地址赋值给newP,此时,new不再指向
                                                  //上面的P,而是指向p2的内存空间,此时就是你下面的赋值
    newP->age = 30;                      //此时newP指向的是p2,不是p,你改变了p2的age,不是p的,所以没有
}                                                 //改变

点评

这个正解  发表于 2014-5-26 00:16
回复 举报
您需要登录后才可以回帖 登录 | 加入黑马