char test1[] = "test";
char *test2; // 空指针,存放地址0x20011604,指向地址0
uint32_t test1_addr;
uint32_t *test2_addr;
test1_addr = (uint32_t)test1;
test1_addr = (uint32_t)&test1;
test1_addr = (uint32_t)&test1[0];
都是取test1的首地址
test2_addr = (uint32_t*)&test2;
&test2 ;取指针地址0x20011604
(uint32_t*)&test2:取地址0x20011604内容作为指针地址,指回test2
(unsigned long)(&((type *)0)->member)
计算member在type结构体中的偏移地址
已知一个结构体里面的成员的地址,反推出该结构体的首地址
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))