黑马程序员技术交流社区

标题: 字符串指针 [打印本页]

作者: JAH562    时间: 2014-10-27 10:27
标题: 字符串指针
#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  不是把地址传上   求解?

作者: Beacon    时间: 2014-10-27 11:09
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. }
复制代码

作者: Beacon    时间: 2014-10-27 11:10
这个在C语言上的话 甚至语法上都是错误的。你的形参和实参都不对应的。。。
作者: cctao    时间: 2014-10-27 19:47
  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

作者: doudou33420    时间: 2014-10-27 19:54
test(&s);         
这里的原因
你这里 &s的意思是 把s刚刚被定义时(NSString* s)开辟的空间的地址给传递过去
而不是把你赋值后的地址传过去..  你做了赋值之后 S里面存储的是你赋值的地址.
你可以这样理解..  NSString* s  在内存开辟一个空间 放了一个S的盒子.    s = @"abc";  把ABC放到盒子里.
那现在我问你 你想要取出ABC 你是要拿盒子的地址(&s) 还是直接找盒子(s)...
作者: 王绍明    时间: 2014-10-27 20:00
输入&s与你的函数test不对应
作者: cctao    时间: 2014-10-27 21:01
doudou33420 发表于 2014-10-27 19:54
test(&s);         
这里的原因
你这里 &s的意思是 把s刚刚被定义时(NSString* s)开辟的空间的地址给传递过 ...

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

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

这里他用要是想用引用那么定义函数 test的时候就应该写void test(NSSting * &s)
调用时直接test(s);就好了
他调用时用 test(&s);其实是传进去指向指针的指针。
我有写一篇文章关于这个的你可以去看看。上面我有付链接的




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