That should be core::ptr::addr_of!(*item) to get the right place inside, and with Rust 1.82 you'll be able to write &raw const *item. Then you can cast as *const () as usize, and once strict provenance stabilizes, you'll be able to write (&raw const *item).addr() or .expose_provenance().
ZSTs do still have an address, although if it's not a member of a larger struct, then it might just be an otherwise-dangling pointer since there's nothing to dereference. Such pointers will always be aligned though.