复合立场:
#include<stdio.h>
struct s{
int x;
int y;
};
int main(){
int j = 5;
printf("\n &j : %p \n",&j);
struct s *p = &(struct s){j++};
printf("\n p : %p &j : %p x : %d y : %d \n",p,&j,p->x,p->y);
return 0;
}
o/p:
-----
&j : 0x7fff416b74ec
p : 0x7fff416b74d0 &j : 0x7fff416b74ec x : 5 y : 0
a]为什么p不能保存j的地址?
b]为什么j不是对struct s进行类型转换?
答案 0 :(得分:1)
声明
struct s *p = &(struct s){j++}; // compiler should raise a warning
不完整。它应该像
struct s *p = &(struct s){.x = j++};
或
struct s *p = &(struct s){.y = j++};
未初始化的成员将由default设置为0
。
p
不包含j
地址的原因很明显p
持有新对象(复合文字)的地址,而不是{{1}的地址本身。
答案 1 :(得分:1)
a)p不保存j的地址,因为p指向新创建的结构。 如果你愿意,那个p指向j,你应该写:
int * p = &j;
b)j是int local(stack)变量,所以我看不出来,它是如何被投射到结构中的。
@David C. Rankin,我改革了我的回答
答案 2 :(得分:0)
对于你的第一个问题,p是struct类型,j是整数类型,你必须使指针和相同数据类型的变量... 像int * p =&amp; j; //其中j是int类型。
答案 3 :(得分:-1)
j是整数类型(原始数据),你试图将它转换为复杂的数据类型(对象)..因此,你试图做装箱和拆箱..这不是c或c ++的概念......