指针与引用 #
一、指针基础 #
1.1 创建指针 #
mojo
def main():
var ptr = Pointer[Int].alloc(5)
for i in range(5):
ptr.store(i, i * 10)
for i in range(5):
print(ptr.load(i))
ptr.free()
main()
1.2 指针类型 #
mojo
def main():
let int_ptr = Pointer[Int].alloc(1)
let float_ptr = Pointer[Float64].alloc(1)
let str_ptr = Pointer[String].alloc(1)
int_ptr.store(0, 42)
float_ptr.store(0, 3.14)
str_ptr.store(0, "Hello")
print(int_ptr.load(0))
print(float_ptr.load(0))
print(str_ptr.load(0))
int_ptr.free()
float_ptr.free()
str_ptr.free()
main()
1.3 空指针 #
mojo
def main():
var ptr: Pointer[Int] = nullptr
if ptr == nullptr:
print("Pointer is null")
ptr = Pointer[Int].alloc(1)
ptr.store(0, 100)
print(ptr.load(0))
ptr.free()
main()
二、指针操作 #
2.1 存储与加载 #
mojo
def main():
let ptr = Pointer[Int].alloc(3)
ptr.store(0, 10)
ptr.store(1, 20)
ptr.store(2, 30)
print(ptr.load(0))
print(ptr.load(1))
print(ptr.load(2))
ptr.free()
main()
2.2 指针算术 #
mojo
def main():
let ptr = Pointer[Int].alloc(5)
for i in range(5):
ptr.store(i, i)
var current = ptr
for i in range(5):
print(current.load(0))
current = current + 1
ptr.free()
main()
2.3 指针偏移 #
mojo
def main():
let ptr = Pointer[Int].alloc(10)
for i in range(10):
ptr.store(i, i * i)
let offset_ptr = ptr.offset(5)
for i in range(5):
print(offset_ptr.load(i))
ptr.free()
main()
三、内存管理 #
3.1 内存分配 #
mojo
def main():
let size = 100
let ptr = Pointer[Int].alloc(size)
for i in range(size):
ptr.store(i, i)
var sum = 0
for i in range(size):
sum += ptr.load(i)
print(f"Sum: {sum}")
ptr.free()
main()
3.2 内存重分配 #
mojo
def main():
var ptr = Pointer[Int].alloc(5)
for i in range(5):
ptr.store(i, i)
ptr = ptr.realloc(10)
for i in range(5, 10):
ptr.store(i, i)
for i in range(10):
print(ptr.load(i))
ptr.free()
main()
3.3 内存复制 #
mojo
def main():
let src = Pointer[Int].alloc(5)
let dst = Pointer[Int].alloc(5)
for i in range(5):
src.store(i, i * 10)
Pointer.memcpy(dst, src, 5)
for i in range(5):
print(dst.load(i))
src.free()
dst.free()
main()
四、安全引用 #
4.1 引用创建 #
mojo
def main():
var value = 42
ref value_ref = value
print(value_ref)
value_ref = 100
print(value)
main()
4.2 引用传递 #
mojo
fn modify(ref x: Int):
x = x * 2
def main():
var num = 10
modify(num)
print(num)
main()
4.3 引用返回 #
mojo
struct Container:
var value: Int
fn __init__(inout self, value: Int):
self.value = value
fn get_ref(ref self) -> ref Int:
return self.value
def main():
var c = Container(42)
ref v = c.get_ref()
print(v)
main()
五、Unsafe操作 #
5.1 Unsafe块 #
mojo
def main():
let ptr = Pointer[Int].alloc(1)
unsafe:
ptr.store(0, 100)
print(ptr.load(0))
ptr.free()
main()
5.2 Unsafe函数 #
mojo
fn unsafe_operation() -> Int:
unsafe:
let ptr = Pointer[Int].alloc(1)
ptr.store(0, 42)
let value = ptr.load(0)
ptr.free()
return value
def main():
print(unsafe_operation())
main()
5.3 Unsafe指针转换 #
mojo
def main():
let int_ptr = Pointer[Int].alloc(1)
int_ptr.store(0, 0x41424344)
unsafe:
let byte_ptr = Pointer[UInt8](int_ptr)
for i in range(4):
print(byte_ptr.load(i))
int_ptr.free()
main()
六、指针与结构体 #
6.1 结构体指针 #
mojo
struct Point:
var x: Int
var y: Int
fn __init__(inout self, x: Int, y: Int):
self.x = x
self.y = y
def main():
let ptr = Pointer[Point].alloc(1)
ptr.store(0, Point(10, 20))
let p = ptr.load(0)
print(f"({p.x}, {p.y})")
ptr.free()
main()
6.2 字段指针 #
mojo
struct Point:
var x: Int
var y: Int
fn __init__(inout self, x: Int, y: Int):
self.x = x
self.y = y
def main():
var p = Point(10, 20)
let x_ptr = Pointer.address_of(p.x)
let y_ptr = Pointer.address_of(p.y)
print(x_ptr.load(0))
print(y_ptr.load(0))
main()
七、指针数组 #
7.1 指针数组 #
mojo
def main():
let ptr_array = Pointer[Pointer[Int]].alloc(3)
for i in range(3):
let inner_ptr = Pointer[Int].alloc(1)
inner_ptr.store(0, i * 10)
ptr_array.store(i, inner_ptr)
for i in range(3):
let inner = ptr_array.load(i)
print(inner.load(0))
inner.free()
ptr_array.free()
main()
7.2 二维数组模拟 #
mojo
def main():
let rows = 3
let cols = 4
let matrix = Pointer[Pointer[Int]].alloc(rows)
for i in range(rows):
let row = Pointer[Int].alloc(cols)
for j in range(cols):
row.store(j, i * cols + j)
matrix.store(i, row)
for i in range(rows):
let row = matrix.load(i)
for j in range(cols):
print(row.load(j))
row.free()
matrix.free()
main()
八、最佳实践 #
8.1 使用defer释放 #
mojo
def main():
let ptr = Pointer[Int].alloc(100)
defer ptr.free()
for i in range(100):
ptr.store(i, i)
main()
8.2 封装指针 #
mojo
struct SafeBuffer:
var ptr: Pointer[Int]
var size: Int
fn __init__(inout self, size: Int):
self.size = size
self.ptr = Pointer[Int].alloc(size)
fn __del__(owned self):
self.ptr.free()
fn get(self, index: Int) -> Int:
if index >= 0 and index < self.size:
return self.ptr.load(index)
return 0
fn set(inout self, index: Int, value: Int):
if index >= 0 and index < self.size:
self.ptr.store(index, value)
def main():
var buf = SafeBuffer(10)
for i in range(10):
buf.set(i, i * i)
for i in range(10):
print(buf.get(i))
main()
8.3 避免裸指针 #
mojo
def main():
let data = [1, 2, 3, 4, 5]
for item in data:
print(item)
main()
九、总结 #
本章学习了:
- 指针创建与操作
- 内存管理
- 安全引用
- Unsafe操作
- 指针与结构体
- 最佳实践
下一章,我们将学习SIMD向量化。
最后更新:2026-03-27