例子1
如果想要表达,将constants_pool->info+i的位置存放一个u8类型的数据
这面这种写法
*(u8*)(constant_pool->info+i)
*(u8*)&(constant_pool->info[i])
意思是,将constant_pool->info[i]这个位置的地址先强制转化为指向u8类型的一个地址,然后再寻址。
总结:
两句的功能是完全一样的。需要注意的是,当用中括号表示偏移时,就已经隐含了寻址的操作。
constant_pool->info+i与constant_pool->info[i]的值是不一样的。
例子2
宏定义函数展开的内容是*(Class**)&cp->info[index] = resolve_class;
这里的用法跟例子1基本相同。表达的意思是info[index]位置应该是一个Class*。
这里同样,[index]隐含了一个寻址操作,所以,先用&取地址,然后说明这个位置是一个指向Class*类型的指针,即(Class**),然后在用*寻址,把那个位置真正的填入Class*,也就是resolve_class。