序
主要来整理一下作业里面的题目:
- 首先一个优先级关系:在C语言中,初等量运算符(),[ ] ,. , -> 优先级高于单目运算符*,++,–
我们在此基础上先记住一些简单的关系:
struct {
int x;
int* y;
}*p;
下面表达式的含义为:
基础为钢!下面我们开始谱写华章(不卸原神)!
一、
我们把这个结构体变得明显一点:
pt = c , 即pt指向数组c的首元素地址,也就是指向红色括号结构体的地址,a和b都是指针,指向各自数组的首元素地址,即1和3的地址。
- A选项,先取元素y,再取y指向的元素,元素y为a,a指向的元素为1,因此A选线值为1;
- B选项,很简单,pt的x就是红色括号结构体的成员x,也就是10;
- C选项,先取p的成员x,再对成员x自增,即x自增后为11;
- D选项,先取p的成员x,再对指针pt自增,那么表达式值仍为x的值,也就是与B选项一样是10;
二、
#include<stdio.h>
struct stu{
int num;
float TotalScore;
};
void f(struct stu p)
{
struct stu s[2]={{20044,550},{20045,537}};
p.num=s[1].num;
p.TotalScore=s[1].TotalScore;
}
int main()
{
struct stu s[2]={{20041,703},{20042,580}};
f(s[0]);
printf("%d %3.0f\n",s[0].num,s[0].TotalScore);
return 0;
}
程序运行后的输出结果是: 【 正确答案: D】
(A) 20045 537
(B) 20044 550
© 20042 580
(D) 20041 703
将s[0]传入函数 f ,那么结构体s[0]只是把值传过去了,但是函数内部对这个结构体不能做出任何修改
因此,函数运行结束后,s[0]里头的值该是多少还是多少。
三、
s指向结构体数组的首元素地址,也就是指向{101,&a}这个结构体
- A,先取p的元素m,p再自增,则表达式值为一个地址。
- B,先取p的元素m,再取m的元素,p再自增,则表达式的值为1
- C,先对p解引用得到结构体{101,&a},再取这个结构体的元素m,得到的还是个地址
- D,p先自增,则p此时指向结构体{102,&b},再取这个结构体的成员m,即&b,再对&b解引用得到2
四、
C,结构类型应该是struct strutype,var是结构变量名
node不是结构类型,struct node才是结构类型
这个题就不解释了,把几种正确的方法杂糅在一起就不对了
五、
这个题真很坑。。。。不仔细看稍微扫一年就觉得对啊对啊换的很成功(比如我。。。)
但是这个swap函数里,你仔细看,相当于交换了a和b的指针,进一步讲,是改变了a和b的指针,
那你要改变指针,是不是得传指针的指针啊?
注意:
如果这里打印的是a和b,那么结果仍然是0 1,因为,swap函数是交换了pa和pb的指向,但是ab的位置是没变得,所以如果要访问交换后的,那就得通过交换后的指针来访问。
六、
p指向数组a的第三个元素,也就是3。
- 第一条printf,先访问指针p指向的元素3,然后元素自增,得到4
- 第二条,p先自减,指向a[1],再访问,得到2。
七、
p指向结构体数组tab的首元素,也就是结构体{1,“ab”};
p先自增,再取p中成员y,也就是“cd”,注意到打印格式为“%c”,因此输出c(一定要记得看输出类型哦~不要倒在最后一步!)
八、
泪目本来自己写对了的但是检查的时候问了gpt改错了wuwuwuuw
#语句的执行次数不代表这个语句为真,也就是说就算i<=j,if(i<=j)这条语句还会执行比较工作!其次,考试的时候这种题写上前3-4个发现规律就知道是多少了
我们这里简单模拟一下:
- i=1,j=0,
i+j=1<=n,
i=1>j=0,(1次)
j++,j=1 - i=1,j=1,
i+j=2<=n,
i=1!>j=1,(2次)
i++,i=2; - i=2,j=1,
i+j=3<=n,
i=2>j=1(3次)
j++,j=2; - i=2,j=2,
i+j=4<=n,
i=2!>j=2(4次)
i++,i=3
……
现在,如果n=4,那么就相当于上面四步都走完了,但一步循环i+j=5,跳出while循环,即if语句执行4次,依次类推1-3,4+次的情况,得到#语句执行n次。
期中考试就先考到前3次作业,后面几次的小题等到期末再整理吧!一会儿再整理一下大题的思路~