我在 objective-c 中使用C指针

这是我的C函数:

long ListReaders(
__out char** szReadersList,
__out unsigned long* pulListLen){
}

long Result;
char* pszReadersList;
unsigned long pulListLen;
Result=ListReaders(&pszReadersList, & pulListLen);

在 objective-c 中使用指针非常容易,但是当我快速尝试使用指针时,还有其他概念,例如UnsafeMutablePointerUnsafePointer等。

如何快速使用相同的C函数

我试图使用它显示像这样
var Result :CLong?
var pszReadersList :CChar?
var pulListLen: CUnsignedLong?
Result=ListReaders(szReadersList:UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>!UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>!>, pulListLen: UnsafeMutablePointer<UInt>!UnsafeMutablePointer<UInt>!>)

你们能建议我快速使用C指针吗

最佳答案

调用C函数的代码应如下所示:

    var result: CLong = 0
    var pszReadersList: UnsafeMutablePointer<CChar>? = nil
    var pulListLen: CUnsignedLong = 0
    result = ListReaders(&pszReadersList, &pulListLen)

一些要点:
  • 在C / Objective-C中,没有基本的-Optionals,因此在Swift中使用C / Objective-C函数时,不应使用它们。
    CLong?-> CLongCUnsignedLong?-> CUnsignedLong
    当声明一些非可选基本类型的变量时,您可能会遇到一些错误,在这种情况下,不要使用可选,而只给它们提供初始值。
  • 当您需要传递UnsafeMutablePointer<AType>UnsafePointer<AType>的参数时,通常会声明AType类型的变量并将其作为inout参数(由前缀“&”指定)传递。
    ListReaders的参数类型变为UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>!UnsafeMutablePointer<UInt>!,因此您需要声明UnsafeMutablePointer<Int8>?(== UnsafeMutablePointer<Int8>?)和UInt(== CUnsignedLong)类型的变量。
  • 关于ios - 如何快速传递C指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41445382/

    10-12 16:08