[英]Pointer confusion in C programming language
大家好,新年快乐!
我很难理解C语言中的指针。 据我所知,指针是一个存储常规变量地址的特殊变量。
我正在发布两个相同的代码示例。 在第一次我输入scanf &d1.am
。
在第二个示例中,如果我将&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
为什么。 怎么&(*ptd1).am
等于&d1.am
而ptd1.am
? 我清楚地输入了ptd1=&d1
!
在此先感谢您的帮助!
.
运算符的优先级高于一元&
。 &d1.am
相当于&(d1.am)
而ptd1.am
相当于(&d1).am
,表示&d1.am
!= (&d1).am
。
结构访问运算符( .
)的优先级高于运算符地址( &
)。 所以&d1.am
是d1
的am
成员的地址,它是一个int*
,它与ptd1
( struct student *
)的类型不同。
还有其他人说过.
运算符的优先级高于&
。 所以ptd1.am相当于(&d1).am(例如参见@haccks的回答)。
我想补充一点, ptd1是一个指向struct的指针 ,因此要获得一个你应该使用的成员->
。 对scanf的调用应该是:
scanf("%d", &(ptd1->am));
你写的是ptd1 =&d1; 这意味着* ptd1将指向d1。
所以如果你想访问d1.am,你需要写(* ptd1).am。
但是在这里你传递给scanf它需要内存地址所以需要传递&所以你需要把&(* ptd1).am。
正如其他人提到的那样(。)具有更高的优先级,因此(。)将首先选择操作数并且表达式将等于
&((* PTD1).AM)
最好使用&(ptd1-> am)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.