大家好,新年快乐!
我很难理解C语言中的指针。 据我所知,指针是一个存储常规变量地址的特殊变量。
我发布了两个相同的代码示例。在第一个我输入scanf &d1.am
。
在第二个示例中,如果我将&d1.am
更改为ptd1.am
,则会弹出编译错误,我无法理解原因。
struct student{
int am;
char stname[20];
char stsurname[20];
};
int main(){
struct student d1;
printf("1st student\n");
printf("Enter am\n");
scanf("%d", &d1.am)
第二个等效样本:
struct student{
int am;
char stname[20];
char stsurname[20];
};
int main(){
struct student d1;
struct student *ptd1;
ptd1=&d1;
printf("1st student\n");
printf("Enter am\n");
scanf("%d", &(*ptd1).am);
我知道正确的是输入&(*ptd1).am
,但我无法理解为什么。 &(*ptd1).am
如何等于&d1.am
和ptd1.am
不是?我清楚地输入了ptd1=&d1
!
提前感谢您的帮助!
答案 0 :(得分:7)
.
运算符的优先级高于一元&
。 &d1.am
相当于&(d1.am)
而ptd1.am
相当于(&d1).am
,即&d1.am
!= (&d1).am
。
答案 1 :(得分:3)
结构访问运算符(.
)has higher precedence而不是地址运算符(&
)。因此&d1.am
是am
d1
成员的地址,int*
,ptd1
,与struct student *
X=reshape(data(:,1), [3 3]);
Y=reshape(data(:,2), [3 3]);
Z=reshape(data(:,3), [3 3]);
pcolor(X,Y,Z);
的类型不同)。
答案 2 :(得分:1)
是否有其他人表示.
运算符的优先级高于&
。所以ptd1.am相当于(& d1).am(参见例如@haccks的答案)。
我想补充一点, ptd1 是指向struct 的指针,因此要获得成员,您应该使用->
。对scanf的调用应该是:
scanf("%d", &(ptd1->am));
答案 3 :(得分:0)
你写的是ptd1 =& d1; 这意味着* ptd1将指向d1。
因此,如果你想访问d1.am,你需要写(* ptd1).am。
但是你在这里传递给scanf它需要内存地址所以需要通过&所以你需要把&(* ptd1).am。
正如其他人提到的那样(。)具有更高的优先级,因此(。)将首先选择操作数,表达式将等于
及((* PTD1).AM)
最好使用&(ptd1-> am)