我有2个结构:
struct b{int b;float d;}; and
struct a{int count; struct b* ptr;}
struct a *a_temp;
现在我为10个b类型的结构分配内存,并将地址放在struct a的ptr中。 (代码是给我的,他们不想出于某种原因使用双指针)
a_temp = (struct a*)malloc(sizeof(struct a));
a_temp->ptr = (struct b*)malloc(10*sizeof(struct b));
struct b* b_temp;
我必须将类型b的第二个结构的地址加载到temp_b。
我试过b_temp = a_temp->ptr[1];
,这是错误的
但b_temp = &(a_temp->ptr[1]);
在我尝试使用它并使用它来访问结构b的内容时有效,为什么会这样?
提前致谢
答案 0 :(得分:3)
ptr[1]
是结构,由ptr + 1
指向(就像*(ptr+1)
),b_temp
获取指向结构的指针,因此您必须传递{{1}的地址},这是a_temp->ptr[1]
。
&a_temp->ptr[1]
编辑:
如果你有一个指针,让我们说expression | type
---------------------------
a_temp->ptr | struct b*
a_temp->ptr[1] | struct b
&a_temp->ptr[1] | struct b*
a_temp->ptr + 1 | struct b*
b_temp | struct b*
,那么下面的表达式是相同的:int * x
和x[1]
,它们都尊重地址*(x+1)
。换句话说,那些表达式值是指针x+1
指向的变量类型,在这种情况下它是x
,因为int
是x
(指向int *
)它为int
变量保留地址。