第一题
[单选题] 以下字符中不是转义字符的是( ).
A. ‘\a'
B. ‘\b'
C. ‘\c'
D. ‘\\'
我的答案:
D
正确答案:
C
转义字符是很多程序语言、数据格式和通信协议的形式文法的一部分。对于一个给定的字母表,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现(没有转义字符开头)时的语义。
第二题:
[单选题] 已知char x[]=“hello”, y[]={‘h’,‘e’,‘a’,‘b’,‘e’};, 则关于两个数组长度的正确描述是( ) .
A. 相同
B. x大于y
C. x小于y
D. 以上答案都不对
我的答案:
A
正确答案:
B
char c[]=“hello”;的长度为6,和下面的字符数组等价。
char c[]={‘h’,‘e’,‘l’,‘l’,‘o’,’\0’};
而和下面的不同:
char c[]={h’,‘e’,‘l’,‘l’,‘o’};
第三题:
[单选题] 在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是( ).
删除
A. 地址传递
B. 单向值传递
C. 由实参传给形参,再由形参传回实参
D. 传递方式由用户指定
我的答案:
A
正确答案:
B
c语言中实际参数和形式参数之间采用单向值传递的方式来传递数据。
第四题:
[单选题] struct student{
char name[10];
int age;
char gender;
}std[3], *p=std;
则以下各输入语句中错误的是:
A. scanf("%d" ,&(*p) .age );
B. scanf("%c" ,&std[0] .gender);
C. scanf("%c" ,&(p->gender));
D. scanf("%s" ,&std.name);
我的答案:
C
正确答案:
D
C.指针变量P指向的是std的首地址,所以&(p->gender)相当于&std[0].gather
D. std是首地址,首地址里面没有成员,所以错误
第五题
[单选题] 在双向链表指针p的指针前插入一个指针q的结点,操作是___________.
A. p->prior=q; q->next=p; p->prior->next=q; q->prior =q;
B. p->prior=q; p->prior->next=q; q->next=p; q->prior =p->prior;
C. q->next=p; q->prior =p->prior; p->prior->next=q; p->prior =q;
D. q->prior =p->prior; q->next=q; p->prior=q; p->prior =q;
我的答案:
A
正确答案:
C
-
声明一个头结点head,其中head->prev指向链表最后一个结点,head —>next指向链表第一个结点。
-
当插入元素和链表中元素重复时,不执行插入操作。
-
双向链表
在单链表的基础上增加了前缀结点,一定程度上提升了查找元素的速度
在查找元素时,可以反向查找前缀结点
插入结点过程(分为4步)
第六题
[多选题] 已知 ii,j 都是整型变量,下列表达式中,与下标引用X[ii][j]不等效的是( ).
A. *(X[ii]+j)
B. *(X+ii)[j]
C. *(X+ii+j)
D. *(*(X+ii)+j)
我的答案:
ABC
正确答案:
BC
A.*(x[ii]+j)的意思是第ii-1行第j-1列,即为x[ii][j]
第七题
[填空题]
以下代码:
int main()
{
int a[3][2] = { (0, 1 ), ( 2, 3 ), (4, 5 ) };
int *p;
p = a[0];
printf("%d\n", p[0]);
system(“pause”);
return 0;
}
输出答案为____.
我的答案:
0
正确答案:
1
此处考察逗号运算符,
逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。
因为有逗号所以P只能取到1,3,5
所以P[0]=1
第八题
[填空题]
以下代码:
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf("%d,%d", *(a + 1), *(ptr - 1));
system(“pause”);
return 0;
}
输出答案为____.(答案用单个空格分隔)
我的答案:
1 1
正确答案:
2 5
&a+1表示取a的地址再加1,此处表示ptr指针指向a的下一位与a类型相同的相邻地址
所以&a+指向&a[5]
由数组指针的相关知识易得*(a+1)==2
a既是数组名又是指向第一个元素的指针
interesting*ptr=(int)(&a+1)
简答题
1
下述三个定义有什么区别?
char * const p;
char const * p
const char *p
正确答案
char * const p; //常量指针,p的值不可以修改
char const * p;//指向常量的指针,指向的常量值不可以改
const char *p; //和char const *p
我的答案
第一个是定义一个字符的指针常数;
第二个是定义一个char类型的指针;
第三个定义一个字符型常量的指针。
清楚的记着当时学过,但是就是想不起来它们的区别,感觉很多概念都是这样,以至于有了上面奇奇怪怪的答案,以后一定要继续加油,温故而知新
2
简述结构体和共用体的区别。
正确答案
两者最大的区别在于内存的分配,结构体和共用体的区别在于:结构体的各个成员会占用不同的内存互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员,结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
还有一个问题就是不会用特别专业的词汇来描述,脑子里面明明知道,但是就是不知道怎么说。
总结:
就是每次都感觉自己会了然后遇到题目还是会错,这应该是基础不扎实的表现把,在接下来的学习中一定要多多理解代码,而不是单纯的敲代码,最近的学习重心放在了敲代码上,但是一不小心就把最基本的概念和原理忘记了,对二维数组和指针还是不能完全理解,对链表也是了解的不够深入,以为自己会敲了就什么都会了,有点眼高手低,打算在闲暇时间重过一遍c语言的基础课程,理解并记住之前落下的东西,打牢基础,继续加油加油!