这两道题怎么分析呀,有关结构体的

题一

struct st{int x;int*y;}*pt;
int a[]={1,2},b[]={3,4};
struct st c[2]={10,a,20,b};
pt=c
//以下选项中表达式值为11的是
//A)   ++pt->x
//B)   pt->x
//C)   *pt->y
//D)   (pt++)->x

题二

#include <stdio.h>
typedef struct{int num;char name[10];int score;}PER;
void fun(PER x[])
{
    int t;
    if(x[0].score>x[1].score)
    {
        t=x[0].score;x[0].score=x[1].score;x[1].score=t;
    }
}
main()
{
    PER s[2]={{1001,"zhang",621},{1002,"wang",585}};
    int i;
    fun(s);
    for(i=0;i<2;i++)
       printf("%d,%s,%d,",s[i].num,s[i].name,s[i].score);
}

img

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



#include <stdio.h>
typedef struct{int num;char name[10];int score;}PER;
void fun(PER x[])
{
    int t;
    if(x[0].score>x[1].score)
    {
        t=x[0].score;x[0].score=x[1].score;x[1].score=t;
    }
}




main()
{
    PER s[2]={{1001,"zhang",621},{1002,"wang",585}};
    int i;
    //调用fun函数的作用是按从大到小时排序结构指针指向的当前结构(x[0])和后面一个结构 (x[1])的值 
    fun(s);
    //然后打印排序后的结构数组 
    for(i=0;i<2;i++)
       printf("%d,%s,%d,",s[i].num,s[i].name,s[i].score);
       
       
       
       
    struct st{int x;int*y;}*pt;
    int a[]={1,2},b[]={3,4};
    struct st c[2]={10,a,20,b};
    pt=c;
//    printf("\n%d\n",++pt->x) ;
    //以下选项中表达式值为11的是
    //根据运算符优先级,先执行pt->x ,
    //pt为结构指针,其地址为 第一个结构的地址,所以pt>x 值一个结构的x,即10
    //然后执行前缀++操作,10变成11,所以答案是A。 
    //A)   ++pt->x  
    
    //10
//    printf("pt->x=%d\n",pt->x); 
//这里pt同上指向第一个结构,然后pt->x为第一个结构的x的值,即10 
    //B)   pt->x
    
    //1
    //pt->y的优先级大于*,所以先执行pt->y,
    //又pt->y为第一个结构的int指针y,即指针a,后面执行*pt->y的结果为数组a的首地址指向int的值,即1 
//    printf("*pt->y=%d\n",*pt->y); 
    //C)   *pt->y
    
    //10
    //这里我如果理解错误的话应该同样先执行->x,然后执行(pt++),这里pt++为使用pt的值后再增加pt++的值,
    //所以 (pt++)->x的结果是第一个结构的x的值,即10,然后pt指向下一个结构。 
    printf("(pt++)->x=%d\n",);     
    //D)   (pt++)->x
}

最好的理解方式还是自己debug一下,这里我简单解释一下

第一题

struct st{int x;int*y;}*pt;   ####定义结构体st和该结构体的一个指针pt

int a[]={1,2},b[]={3,4};  ####定义两个数组,为结构体里的y做准备

struct st c[2]={10,a,20,b}; #####定义结构体数组c,进行初始化

pt=c  ####将数组c的首地址赋给pt,此时pt便是指向c[0]

所以选择a项
解析:
//以下选项中表达式值为11的是

//A)   ++pt->x  //pt->x=c[0].x=10,自增加一

//B)   pt->x  //解释如上此时为10

//C)   *pt->y  //该式等价于c[0].y[0]=a[0]=1

//D)   (pt++)->x // 由于括号,p先赋值再后移一个,等价于B

题二

第二题比第一期还简单,全局定义了一个结构体per,从主函数进入,定义了一个结构体数组s[2]初始化,然后fun函数就是比较该结构体数组里,第一个的分数是不是比第二个大,大的话就把他两的分数交换一下,然后输出

这就是结构体的数组,第一题选A,->优先级大于++,所以先取值取到10后++变为11。第二题跟第一题差不多,就是把结构体数组当参数传进去按分数从低到高排序