Swift 打印局部常量变量的内存地址

Swift 打印局部常量变量的内存地址,swift,function,memory-address,Swift,Function,Memory Address,我有一个非常简单的客户类类型,名为Dog,它只包含一个字符串类型的变量。可以更改Dog类型实例值的函数定义如下 问题: d是函数中定义的局部变量,我尝试了withUnsafePointer,似乎它需要inout参数或至少一个可变变量(var),我想知道是否有办法打印出局部变量的内存地址d class Dog { var name: String = "Fido" } func dogChanger(_ d: Dog) { d.name = "Rover" withUns

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

感谢您在Swift中提供的时间和帮助,因为这是一个类的实例,将
var
变量分配给
Dog
d
实例将不会复制它,因此您对该指针所做的任何更改都将反映在初始值中。遵守以下规定:

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
在我的机器上,这会输出以下内容:

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
如您所见,在print语句1中,我们直接在
d
上更改了名称,然后记录了名称。在第二个示例中,我们看到当我们更改变量
x
的名称时,
d
的名称发生了更改。在第三条语句中,我们得到
x
的地址。在第四个语句中,我们看到更改
x
指向的对象的名称更改了
d
的名称,最后在最后一个语句中,我们看到我们传入的
Dog
实例的最终名称以这种方式更改。这告诉我们
d
x
指向同一个对象


记住,;但是,该类实例仅保证在执行
dogChanger
函数时存在,因此不允许该指针转义该函数。

请尝试
let dog=d
,然后使用
dog
。感谢您的帮助。我相信我没有很好地解释我的问题。通过创建一个x(var),它在堆栈中创建一个新的内存块,与前一个内存块(即d(let))结合使用,其中两个堆栈块包含引用堆中相同对象的相同“指针”,但这两个堆栈块有自己的堆栈地址。我认为0x00007fff5dd49200是x的堆栈地址,但我对d的堆栈地址感兴趣,这可以在函数内部打印吗?再次感谢。