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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© JAH562 中级黑马   /  2014-10-27 10:27  /  1491 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

#import <Foundation/Foundation.h>   

void test(NSString *s){
        s=@"def";
       
       
        }
int main(int argc, const char * argv[])  
{        
     @autoreleasepool
     {  
     NSString* s=@"abc";
       test(&s);
      
      NSLog(@"s=%@",s);
         
     }  
     return 0;  
}

我想要改变 s的值 为何输出的还是 abc  不是把地址传上   求解?

评分

参与人数 1技术分 +1 收起 理由
星河鹭起 + 1

查看全部评分

8 个回复

倒序浏览
OC的我还不太懂 看一个C语言的一模一样的吧、然后你自己感受一下。你可以输入abc然后看看啊
  1. void test(char *str)
  2. {
  3.         char *sc = "def";
  4.         strcpy(str, sc);
  5. }


  6. int main()
  7. {
  8.         char string[128];
  9.         gets(string);
  10.         test(string);
  11.         cout << string;
  12. }
复制代码
回复 使用道具 举报
这个在C语言上的话 甚至语法上都是错误的。你的形参和实参都不对应的。。。
回复 使用道具 举报
  1. #import <Foundation/Foundation.h>   

  2. void test(NSString **s){
  3.        * s=@"def";
  4.         
  5.         }
  6. int main(int argc, const char * argv[])  
  7. {        
  8.      @autoreleasepool
  9.      {  
  10.      NSString* s=@"abc";
  11.        test(&s);
  12.       
  13.       NSLog(@"s=%@",s);
  14.          
  15.      }  
  16.      return 0;  
  17. }
复制代码

楼主这个是函数形参的问题,要想正确改变字符串应该是地址传递,这一题楼主用的是值传递了
试一下上面的代码,应该没错了,给你个地址,我最近写了一篇关于参数的问题,你看看。http://blog.csdn.net/dashudeshu/article/details/40460913
回复 使用道具 举报
test(&s);         
这里的原因
你这里 &s的意思是 把s刚刚被定义时(NSString* s)开辟的空间的地址给传递过去
而不是把你赋值后的地址传过去..  你做了赋值之后 S里面存储的是你赋值的地址.
你可以这样理解..  NSString* s  在内存开辟一个空间 放了一个S的盒子.    s = @"abc";  把ABC放到盒子里.
那现在我问你 你想要取出ABC 你是要拿盒子的地址(&s) 还是直接找盒子(s)...
回复 使用道具 举报
输入&s与你的函数test不对应
回复 使用道具 举报
cctao 中级黑马 2014-10-27 21:01:18
7#
doudou33420 发表于 2014-10-27 19:54
test(&s);         
这里的原因
你这里 &s的意思是 把s刚刚被定义时(NSString* s)开辟的空间的地址给传递过 ...

我认为他的函数这样写是编译不通过的,将test(&s)改为test(s)后虽然能运行成功,不过并没有改变字符串,你可以试试看。所以应该将test(NSString * s)函数的参数改为test(NSString **s)
回复 使用道具 举报
cctao 发表于 2014-10-27 21:01
我认为他的函数这样写是编译不通过的,将test(&s)改为test(s)后虽然能运行成功,不过并没有改变字符 ...

哦 我理解错意思了 他想改S的值.. 我看他NSLOG  S  我以为他输出有误呢....
原来他是想把S的引用传过去....  然后形参持有传过来的地址  就可以更改原方法的值了...  
我也刚接触XCODE 你那样我没用过. 不过应该跟我说一个道理 只是表现形式是这么写
回复 使用道具 举报
cctao 中级黑马 2014-10-28 00:10:53
9#
doudou33420 发表于 2014-10-27 21:46
哦 我理解错意思了 他想改S的值.. 我看他NSLOG  S  我以为他输出有误呢....
原来他是想把S的引用传过去.. ...

这里他用要是想用引用那么定义函数 test的时候就应该写void test(NSSting * &s)
调用时直接test(s);就好了
他调用时用 test(&s);其实是传进去指向指针的指针。
我有写一篇文章关于这个的你可以去看看。上面我有付链接的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马