黑马程序员技术交流社区

标题: 为什么结果是那样的那 [打印本页]

作者: ★彬★卍囧神    时间: 2014-5-25 16:52
标题: 为什么结果是那样的那
本帖最后由 ★彬★卍囧神 于 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

作者: m573555543    时间: 2014-5-25 17:15
本帖最后由 m573555543 于 2014-5-25 17:34 编辑



作者: S捭K阖Y    时间: 2014-5-25 22:20
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的,所以没有
}                                                 //改变





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2