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;
}
这里的代码的结构体数组 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。