C语言中结构体变量x的地址&x具体指向何处?
结构体地址的本质
首先明确:&x确实是结构体变量x的地址,它指向的是这个结构体在内存中起始存储的位置,也就是结构体第一个成员a的起始地址。
和数组的情况类比说明:
- 对于数组
char a[] = "This is a test";,数组名a本身等价于&a[0](第一个元素的地址),*a取的是第一个元素的具体值; - 对于结构体变量
x,&x和&x.a的数值完全相同,但两者的类型有区别:&x是指向整个匿名结构体的指针(类型为struct <匿名结构体>*),而&x.a是指向int类型的指针。
举个直观的内存布局例子(假设int占4字节,无额外内存对齐):
内存地址: 0x100 0x104 +-----+-----+ x的内容: | a | b | +-----+-----+
此时&x的数值就是0x100,和&x.a完全一致,但如果对这两个指针做偏移操作,步长会不一样:对&x偏移的步长是整个结构体的大小(8字节),对&x.a偏移的步长则是int类型的大小(4字节)。
简言之,结构体的地址就是它在内存中开始存放的起始位置,逻辑上和数组的起始地址一致,区别仅在于结构体是不同类型成员的连续(可能带对齐)存储,而数组是同类型元素的连续存储。
内容的提问来源于stack exchange,提问作者Fary
相关产品推荐
相关产品推荐

