Swift中的简单指针操作?
假设我在C++中执行以下操作: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
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
,对吧?不(我不确定它是否安全)。请参阅第页底部的免责声明