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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    @public
    int age;
    double height;
}
- (void)print;
@end

void test1(int newAge, double newHeight);
void test2(Person *newP);
void test3(Person *newP);
void test4(Person *newP);

int main()
{
    Person *p = [Person new];
    p->age = 10;
    p->height = 1.5f;

    test1(p->age, p->height);
    [p print];//10 1.5

    test2(p);
    [p print];//20 1.7

    test3(p);
    [p print];//10 1.5

    test4(p);
    [p print];//60 1.9

    return 0;
}

@implementation Person
- (void)print
{
    NSLog(@"年龄=%d,身高=%f", age, height);
}
@end

void test1(int newAge, double newHeight)
{
    newAge = 10;
    newHeight = 1.6;
}

void test2(Person *newP)
{
    newP->age = 20;
    newP->height = 1.7;
}

void test3(Person *newP)
{
    Person *p2 = [Person new];
    p2->age = 40;
    p2->height = 1.8;
    newP = p2;

    newP->age = 30;
}

void test4(Person *newP)
{
    Person *p2 = newP;
    p2->age = 50;
    p2->height = 1.9;
    newP->age = 60;
}

如上 main函数旁边的注释是我做出来的答案 ,1,2,4三个的输出和老师的答案是一致的,但是第3个答案是20  1.7 。怎么看也想不明白,求懂的解释一下?还是老师给的答案是错误的?

5 个回复

倒序浏览
       没人么  求人解答啊 郁闷的快吐血了
回复 使用道具 举报
第三个,p把地址赋给了newP,但是在test3函数中,最后p2把地址又赋给了newP,那么现在newP中最后的地址是p2的,不是主函数传过来的p,那你在函数中改的值,只是修改了newP对应的值,也是p2对应的值,却不是主函数p的值。其实想要搞懂原因,楼主可以打断点,一步一步的看变量的地址和值
回复 使用道具 举报
mony 发表于 2015-5-13 13:04
第三个,p把地址赋给了newP,但是在test3函数中,最后p2把地址又赋给了newP,那么现在newP中最后的地址是p2 ...

谢谢 ,说的很清楚 3q
回复 使用道具 举报
老师的视频里面有见解,跟上边说的一样,test3改变的是p2所指向的对象的值,与p无关
回复 使用道具 举报
3中只是把p2里的地址传给newp,原来的值并没有改变,楼主可以画图理解下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马