打印本地常量变量的内存地址

时间:2017-03-03 15:33:38

标签: swift function memory-address

我有一个非常简单的客户类类型,名为 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 
}

感谢您的时间和帮助

1 个答案:

答案 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}}函数的类实例,所以不要让该指针转义函数。