指针传递Objective C或C语法

时间:2013-06-13 01:56:40

标签: ios objective-c c

我有一个方法,它采用以下参数。

void callAMethood(const void *iVar){}

现在我不清楚我应该如何指针

以下似乎很简单,我只是传递地址而不是值。

NSString *a=@"Hi";
callAMethood(&a);

但是,以下似乎效果很好,但理解语法很困难。

char const * const a="HI";
callAMethood(&a);

或甚至是callAMethood(a);

4 个答案:

答案 0 :(得分:4)

正如xlc指出的那样,两者都是错误的。

NSString *a=@"Hi";
callAMethood(&a); // This passes a NSString **


char const * const a="HI";
callAMethood(&a); // This passes a char const * const *

两者都有效,因为指向指针的指针可以转换为void *

尽管如此,你也不太可能。

利用C在编译时进行类型检查,并使用类型更具体。

void awesome_function(NSString *amazingString);

NSString *yay = @"oh my god yes";
awesome_function(yay); // ok
awesome_function(&yay); // compiler error

简而言之:除非你有充分的理由使用void *(对于Cocoa(Touch)应用程序我认为不太可能),不要这样做。

如果您不想进行编译时类型检查,请使用类似Python的内容。如果您希望能够处理不同的Objective C对象类型,那就是id的用途。

答案 1 :(得分:1)

你问你应该传递给函数(它不是方法的声明):

void callAMethood(const void *iVar) {...}

答案是没人能告诉你!

您的函数采用类型void *的值 - 此类型通常在C中用于表示“指向任何内容的指针”。它不是用于将指针指向任何对象的函数的类型,即id

但这并没有让我们走得太远,因为我们不知道callAMethood期待什么我们不知道该通过什么 - 我们无法告诉你答案。

现在举个例子:

NSString *a = @"Hi";
callAMethood(&a);

这是一个有效的调用,它传递一个指向变量a的指针。但是:

callAMethood(a);

也是一个有效的调用,它传递存储在变量a中的指针。在不知道callAMethood期待什么的情况下,我们无法告诉您哪个是正确的呼叫。这同样适用于您的第二个例子。

HTH

答案 2 :(得分:0)

每个指针都可以隐式转换为void *

修改

  1. 正如凯文所说,只有数据指针。

  2. 正如CRD所说,

  3.   
        

    答案是没人能告诉你!

      

    没有callAMethood功能的信息。除了callAMethood真的不关心哪种类型iVar(例如它只是打印指针)之外,所有这些调用都是语法上有效的(可以编译),并且语义无效,通常是无效的。

答案 3 :(得分:0)

上面说的是正确的,但你也可以使用UTF8String从NSString中获取一个const char *

const char * myStr = [a UTF8string];
callMehtod(myStr);

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html