我有一个方法,它采用以下参数。
void callAMethood(const void *iVar){}
现在我不清楚我应该如何指针
以下似乎很简单,我只是传递地址而不是值。
NSString *a=@"Hi";
callAMethood(&a);
但是,以下似乎效果很好,但理解语法很困难。
char const * const a="HI";
callAMethood(&a);
或甚至是callAMethood(a);
答案 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 *
。
修改强>
正如凯文所说,只有数据指针。
正如CRD所说,
答案是没人能告诉你!
没有callAMethood
功能的信息。除了callAMethood
真的不关心哪种类型iVar
(例如它只是打印指针)之外,所有这些调用都是语法上有效的(可以编译),并且语义无效,通常是无效的。
答案 3 :(得分:0)
上面说的是正确的,但你也可以使用UTF8String从NSString中获取一个const char *
const char * myStr = [a UTF8string];
callMehtod(myStr);