地址与指针
指针就是拥有类型上下文的地址,告诉编译器以何种类型读写某地址的数据
指针转为地址,去掉类型上下文转为整数即可;地址转指针,加上类型上下文即可
栈上类型地址
栈上类型的局部变量的地址就是其在栈上的地址
var a = 3
let ptr = withUnsafePointer(to: &a) { $0 }
let addr = UInt(bitPattern: ptr)
let ptr2 = UnsafePointer<Int>(bitPattern: addr)!
let a2 = ptr2.pointee
#![allow(unused)] fn main() { let a = 3; let ptr = &a as *const i32; let addr = ptr as usize; let ptr = addr as *const i32; let a = unsafe { *ptr }; }
int a = 3;
int *ptr = &a;
long long addr = (long long)ptr;
int *ptr2 = (int*)addr;
int a2 = *ptr2;
// arm64, AT&T
_main:
sub sp, sp, #64
stp x29, x30, [sp, #48]
add x29, sp, #48
// int a = 3;
mov w8, #3
str w8, [x29, #-4]
// int *ptr = &a;
sub x8, x29, #4
str x8, [x29, #-16]
// long long addr = (long long)ptr;
ldr x8, [x29, #-16]
str x8, [x29, #-24]
// int *ptr2 = (int*)addr;
ldr x8, [x29, #-24]
str x8, [x29, #-32]
// int a2 = *ptr2;
ldr x8, [x29, #-32]
ldr w8, [x8]
str w8, [x29, #-36]
ldp x29, x30, [sp, #48]
add sp, sp, #64
ret
堆上类型地址
堆上类型的指针变量的地址就是其在栈上的地址
堆上类型的堆内存地址就是指向其堆内存的指针转为地址的值
class C {
let a: Int
init(a: Int) {
self.a = a
}
}
let c = C(a: 3)
let addr = unsafeBitCast(c, to: UInt.self)
let ref = unsafeBitCast(addr, to: C.self)
#![allow(unused)] fn main() { struct C { a: i32, } let c = Box::new(C { a: 3 }); let addr = c.as_ref() as *const C as usize; let ptr = addr as *const C; }
struct C {
int a;
};
struct C *c = malloc(sizeof(struct C));
c->a = 3;
long long addr = (long long)c;
struct C *ptr = (struct C*)addr;