繁体   English   中英

C编程语言中的指针混淆

[英]Pointer confusion in C programming language

大家好,新年快乐!

我很难理解C语言中的指针。 据我所知,指针是一个存储常规变量地址的特殊变量。

我正在发布两个相同的代码示例。 在第一次我输入scanf &d1.am

在第二个示例中,如果我将&d1.am更改为&d1.amptd1.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.amptd1.am 我清楚地输入了ptd1=&d1

在此先感谢您的帮助!

. 运算符的优先级高于一元& &d1.am相当于&(d1.am)ptd1.am相当于(&d1).am ,表示&d1.am != (&d1).am

结构访问运算符( . )的优先级高于运算符地址( & )。 所以&d1.amd1am成员的地址,它是一个int* ,它与ptd1struct 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM