结构编程程序pta练习

struct stu{
  int x; 
  int *y;
} *p;
int dt[4] = {10, 20, 30, 40};
struct stu a[4] = {50, &dt[0], 60, &dt[1], 70, &dt[2], 80, &dt[3]};
 
int main( )
{ 
   p=a;
   printf("%d", ++(*p->y));//p->y 值为&dt[1],++20==21
   return 0;
}
 

p->y的值为什么不是&dt[0] 为什么输出的不是11呢

下面是我的理解,供参考:

这应该是因为运算符优先级的原因。

首先结构数组初始化采用了数组全部元素初始化,省略了各数组元素之间的花括号,初始化了四个结构数组元素;接着,p赋值为a,p即指向数组第一个结构元素,p->y即为访问第一个结构的成员y,*p->y为取第一个结构的成员y指向的值,即为10,然后++,由10变为11.

测试代码如下:

参考链接:

#include <stdio.h> 
struct stu{
  int x; 
  int *y;
} *p;
int dt[4] = {10, 20, 30, 40};
struct stu a[4] = {50, &dt[0], 60, &dt[1], 70, &dt[2], 80, &dt[3]};
 
int main( )
{ 
   p=a;
   printf("%d", ++(*p->y));
   //printf("\n%d", p->x);
   return 0;
}
 

img

这里的代码的结构体数组 a 初始化了四个结构体变量,每个变量都有两个成员,分别为 x 和 y。

对于数组 a 的初始化,第一个结构体变量的 x 成员为 50,y 成员为指向 dt[0] 的指针;第二个结构体变量的 x 成员为 60,y 成员为指向 dt[1] 的指针;以此类推。

接着,指针 p 指向了结构体数组 a 的第一个元素。因此,p->y 的值为 &dt[1]。

在执行 printf 函数之前,先执行了前缀递增操作 ++(*p->y),其中 p->y 指向的值为 dt[1],该值加 1 后为 21。因此,输出的结果为 21。