我有一个非常简单的客户类类型,名为 Dog ,它只包含一个字符串类型的变量。可以更改 Dog 类型实例值的函数定义如下。
问题:
d 是函数中定义的局部变量,我尝试过withUnsafePointer,似乎需要inout参数或者至少需要一个可变变量(var ),我想知道是否有办法打印出局部变量 d 的内存地址?
class Dog {
var name: String = "Fido"
}
func dogChanger(_ d: Dog) {
d.name = "Rover"
withUnsafePointer(&d) { NSLog("\($0)") } //d needs to be a inout parameter
}
感谢您的时间和帮助
答案 0 :(得分:0)
在Swift中,由于这是一个类的实例,因此为var
d
Dog
class Dog {
var name: String = "Fido"
}
func dogChanger(_ d: Dog) {
d.name = "Rover"
var x = d
// 1
print(d.name)
x.name = "Changed1"
// 2
print(d.name)
withUnsafePointer(to: &x) {
$0.pointee.name = "Changed2";
// 3
print("\($0)")
}
// 4
print(d.name)
}
var d = Dog()
dogChanger(d)
//5
print(d.name)
分配Rover
Changed1
0x00007fff5dd49200
Changed2
Changed2
变量将不会复制它,因此您对该指针所做的任何更改都将反映在最初的。请注意以下事项:
d
在我的机器上输出以下内容:
d
如您所见,在print statement 1中,我们直接在x
上更改了名称。在第二个时,我们看到当我们更改变量x
的名称时,x
的名称已更改。在第三个语句中,我们得到d
的地址。在第四个我们看到更改Dog
指向的对象的名称更改了d
的名称,最后在最后一个语句中我们看到我们成功传递的x
实例已经它的最终名称改变了这种方式。这告诉我们dogChanger
和 arr_hist = new TickByTick[0];
SqlDataReader l_dr;
string cmd = "SELECT * FROM " + symb + " ORDER BY DT ASC, CumVol ASC";
if (RunSelectCommand(cmd,out l_dr))
{
if(l_dr.HasRows)
{
while (l_dr.Read())
{
nr_tick += 1;
Array.Resize(ref arr_hist, nr_tick + 1);
arr_hist[nr_tick].d_time = l_dr.GetDateTime(1);
arr_hist[nr_tick].price = l_dr.GetDouble(2);
arr_hist[nr_tick].bid = l_dr.GetDouble(3);
arr_hist[nr_tick].ask = l_dr.GetDouble(4);
arr_hist[nr_tick].Vol = l_dr.GetInt32(5);
arr_hist[nr_tick].CumVol = l_dr.GetInt32(6);
}
}
}
指向同一个对象。
请记住;但是,只保证存在执行{{1}}函数的类实例,所以不要让该指针转义函数。