C编程语言中的指针混淆

时间:2016-01-11 17:35:17

标签: c pointers

大家好,新年快乐!

我很难理解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.amptd1.am不是?我清楚地输入了ptd1=&d1

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

结构访问运算符(.has higher precedence而不是地址运算符(&)。因此&d1.amam 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)