Swift中的简单指针操作?

Swift中的简单指针操作?,swift,pointers,Swift,Pointers,假设我在C++中执行以下操作: int i = 1; int* ptr = &i; *ptr = 2; cout << i << '\n'; inti=1; int*ptr=&i; *ptr=2; 是的。 你不能完全按照你在问题中的尝试去做。它不会编译。Swift不允许您直接访问这样一个值的地址。归根结底,原因主要是因为根本没有好的理由这么做 然而,我们确实在Swift中看到了&操作符 首先,在声明函数参数时有inout关键字: func doubleIfP

假设我在C++中执行以下操作:

int i = 1;
int* ptr = &i;
*ptr = 2;
cout << i << '\n'; 
inti=1;
int*ptr=&i;
*ptr=2;
是的。
你不能完全按照你在问题中的尝试去做。它不会编译。Swift不允许您直接访问这样一个值的地址。归根结底,原因主要是因为根本没有好的理由这么做

然而,我们确实在Swift中看到了
&
操作符


首先,在声明函数参数时有
inout
关键字:

func doubleIfPositive(inout value: Float) -> Bool {
    if value > 0 {
        value *= 2
        return true
    }
    return false
}
要调用此方法,我们需要
操作符:

let weMadeARadian = doubleIfPositive(&pi)

当我们有一个函数接受类型为
UnsafeMutablePointer
(以及这些指针结构的其他变体)的参数时,我们可以看到类似的用法。在这种特定情况下,它主要用于与C&Objective-C的互操作性,我们可以声明这样一种方法:

bool doubleIfPositive(浮点*值)->bool{
如果(值>0){
数值*=2;
返回true;
}
返回false;
}
该方法的Swift界面最终看起来像这样:

func addressOf<T>(value: UnsafeMutablePointer<T>) -> UnsafeMutablePointer<T> {
    return value
}
func doubleIfPositive(值:UnsafeMutablePointer)->Bool
从Swift调用此方法实际上与以前使用
inout
方法时一样:

let weMadeARadian = doubleIfPositive(&pi)

但这是我在Swift中能找到的这个
&
操作符仅有的两种用法

也就是说,我们可以编写一个函数,利用第二种形式将参数传递给带有
&
运算符的方法,并返回封装在不安全可变指针中的变量。看起来是这样的:

func addressOf<T>(value: UnsafeMutablePointer<T>) -> UnsafeMutablePointer<T> {
    return value
}


如中所述,如果需要,我们也可以直接分配内存

var iPtr = UnsafeMutablePointer<Int>.alloc(1)


但是 如果您这样做的目的不是为了与C或Objective-C的互操作性,那么您很可能无法正确地驾驶。所以,在你开始用Swift中的值类型指针在镇上到处跑之前,请确保这是你绝对需要做的。自从发布以来,我一直在写Swift,但我从未发现有必要使用这些恶作剧。

是的。 你不能完全按照你在问题中的尝试去做。它不会编译。Swift不允许您直接访问这样一个值的地址。归根结底,原因主要是因为根本没有好的理由这么做

然而,我们确实在Swift中看到了
&
操作符


首先,在声明函数参数时有
inout
关键字:

func doubleIfPositive(inout value: Float) -> Bool {
    if value > 0 {
        value *= 2
        return true
    }
    return false
}
要调用此方法,我们需要
操作符:

let weMadeARadian = doubleIfPositive(&pi)

当我们有一个函数接受类型为
UnsafeMutablePointer
(以及这些指针结构的其他变体)的参数时,我们可以看到类似的用法。在这种特定情况下,它主要用于与C&Objective-C的互操作性,我们可以声明这样一种方法:

bool doubleIfPositive(浮点*值)->bool{
如果(值>0){
数值*=2;
返回true;
}
返回false;
}
该方法的Swift界面最终看起来像这样:

func addressOf<T>(value: UnsafeMutablePointer<T>) -> UnsafeMutablePointer<T> {
    return value
}
func doubleIfPositive(值:UnsafeMutablePointer)->Bool
从Swift调用此方法实际上与以前使用
inout
方法时一样:

let weMadeARadian = doubleIfPositive(&pi)

但这是我在Swift中能找到的这个
&
操作符仅有的两种用法

也就是说,我们可以编写一个函数,利用第二种形式将参数传递给带有
&
运算符的方法,并返回封装在不安全可变指针中的变量。看起来是这样的:

func addressOf<T>(value: UnsafeMutablePointer<T>) -> UnsafeMutablePointer<T> {
    return value
}


如中所述,如果需要,我们也可以直接分配内存

var iPtr = UnsafeMutablePointer<Int>.alloc(1)


但是 如果您这样做的目的不是为了与C或Objective-C的互操作性,那么您很可能无法正确地驾驶。所以,在你开始用Swift中的值类型指针在镇上到处跑之前,请确保这是你绝对需要做的。自发布以来,我一直在写Swift,我从未发现有必要使用这些恶作剧。

像这样(这不是唯一的方法,但很清楚):

这不是一个非常有趣的例子,但它与您的伪代码完全并行,我们确实直接进入了已经分配的内存并对其进行了修改,这正是您想要做的

当你想做的是像在C中做指针算术一样快速地循环内存时,这种事情会变得更加有趣。

像这样(不是唯一的方法,但很清楚):

这不是一个非常有趣的例子,但它与您的伪代码完全并行,我们确实直接进入了已经分配的内存并对其进行了修改,这正是您想要做的


这类事情变得更加有趣,当你想做的是像循环通过内存一样快,就像在C中做指针运算一样。

答案很好,取消了我的,但还有一件事要补充。您可以自己分配内存并使用
var iptr:UnsafeMutablePointer=UnsafeMutablePointer.alloc(1)
@Kevin声明指针类型是的,我可以将其添加到答案中。这是有用的信息(并有助于使其更加规范化),但这与问题所问的有点不同。您确定使用
&
操作符
addressOf(&i)
校准
addressOf
是安全的吗?来自Apple的:“传递给函数的指针保证仅在函数调用期间有效。不要试图保留指针并在函数返回后访问它。”——
addressOf
违反了这一点。苹果特别提到了
UnsafePointer
,但同样的道理也应该适用于
unsafemeutablepointer
,对吧?不(我不确定它是否安全)。请参阅第页底部的免责声明