实验室第一次考核

1.在双向链表指针p的指针前插入一个指针q的结点操作是( B )。
 A. p->prior=q:;p->prior->next=q; q->=p; q-> prior =p-> prior。
 B.q->next=p;q->priorp->prior;p->prior--next=q;p->prior=q。
 C. q-> prior =p-> prior; q->next=q;p-prior=q; p->prior =q。
 D. p->prior=q; q->next=p;p->prior->next= q;q->prior =q。

对简单的单向链表基本操作还可以,但是双向链表还需要学习。 

实验室第一次考核_第1张图片

2.struct student{
   char name[10];
   int age;
   char gender;
   }std[3],*p=std;
则以下各输入语句中错误的是( B )
 A. scanf( "%d",&(*p). age);
 B. scanf("%s",&std.name);
 C. scanf("%c",&std[0] .gender);
 D. scanf("%c",&(p->gender);

知识点是结构型数组的应用。选项A中“&(*p).age”代表的是std[0]age的地址,是正确的,选项D也是正确的,选项C先用指针变量引用结构型的成员name,然后取它的地址,也是正确的,选项B中的“std.name"是错误的引用,因为std是数组名,代表的是数组的首地址,地址没有成员“name”。

3.阅读下面的程序
 #include
 void main(){
 int i,j;
 scanf("%3d%2d" ,&i, &j);
 printf("i=%d j=%d\n",i,j);}
如果从键盘上输入1234567<回车>则程序的运行结果是( C )
A.=1234,j=567.
B.i=1,j=2.
C.i=123,j=45.
D.i=123,j=4567.

%3d 表示输出3位整型数, 不够3位右对齐。%2d 表示输出2位整型数, 不够2位右对齐。

格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,用来确定输出内容格式。在"%"和字   母之间插进数字表示最大场宽。

 4.以下字符中不是转义字符的是( D )
 A."\a"
 B."\b"
 C."\\"
 D. "\c"

 所有的转义字符和所对应的意义:

转义字符

意义

ASCII码值(十进制)

\a

响铃(BEL)

007

\b

退格(BS) ,将当前位置移到前一列

008

\f

换页(FF),将当前位置移到下页开头

012

\n

换行(LF) ,将当前位置移到下一行开头

010

\r

回车(CR) ,将当前位置移到本行开头

013

\t

水平制表(HT) (跳到下一个TAB位置)

009

\v

垂直制表(VT)

011

\\

代表一个反斜线字符''\'

092

\'

代表一个单引号(撇号)字符

039

\"

代表一个双引号字符

034

\?

代表一个问号

063

\0

空字符(NULL)

000

\ddd

1到3位八进制数所代表的任意字符

三位八进制

\xhh

十六进制所代表的任意字符

十六进制

 5.对二维数组的正确定义是( B )
A.int a[2,3]={1,2,3,4,5,6)
B.int a[ ][3]=(1,2,3,4,5,6)
C.int a[2][ ]={1,2,3,4,5,6}
D.int a[ ][ ]={1,2,3.4,5,6}

 二维数组的初始化注意事项:
1)可以只对部分元素赋初值,未赋初值的元素自动取为0。
2)如对全部元素赋初值,则第一维的长度可以不给出。(即B选项)

6.在调用函数时如果实参是简单变量它与对应形参之间的数据传递方式是( C )
A.由实参传给形参再由形参传回实参
B.地址传递
C.单向值传递
D.传递方式由用户指定

 C语言函数参数的传递默认是 按值传递,属于单向数值传递。

值传递与地址传递:

值传递的特点是单向传递,即主调函数调用时给形参分配存储单元,把实参的值传递给形参,在调用结束后,形参的存储单元被释放,而形参值的任何变化都不会影响到实参的值,实参的存储单元仍保留并维持数值不变。

地址传递 这种方式使用数组名或者指针作为函数参数,传递的是该数组的首地址或指针的值,而形参接收到的是地址,即指向实参的存储单元,形参和实参占用相同的存储单元,这种传递方式称为“参数的地址传递”。

7.有枚举类型定义enum weekday { Sun,Mon,Tue=0,Wed, Thu,Fri,Sat } 则按值 Fri 对应的整数值为( C ).
A.4
B.2
C.3
D.1

第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。如果在实例中把第n个枚举成员的值定义为 x,第n+1个就为x+1 ,以此类推.

8.已知 char x[]="hello",y={'h','e','a','b','e'} ;,则关于两个数组长度的正确描述是( C ),
A.以上答案都不对
B.x小于y
C.x大于y
D.相同

 第一个是把一个字符串存在首地址是x的内存里,字符串是有结束标志'\0',所以整个数组长度为6,第二个是把5各字符分别赋给y[0]到y[4]五个数组元素,所以数组长度为5,即x大于y。

9.下面程序的输出结果是( C )
 #include
 void main(){
 int a=-1, b=4,k;
 k=(++a<=0)&(b--<=0)
 printf( %d, %d, %d\n",k,a,b);}
A.0,1,2
B.1,1,2
C.0,0,3
D.1,0,3

这里主要考查++i,i++,--i,i-- 的使用

i++与i-- 为先赋值然后进行自增自减

++i与--i 为先自增自减然后进行赋值

10.已知 ii , j 都是整型变量下列表达式中与下标引用X[ii][j]不等效的是( CD )
 A.*(*(X+ii)+ j)
 B.*(X[ii]+ j)
 C.*( X+ii+ j)
 D.*(X+ ii)[j]

对二维数组下标的引用 一般情况下:都是使用a[i][j],和*(*(a+i)+j)的形式。

对上述题目由于a[i]等价于  *(a+i)所以 A.*(*(X+ii)+ j) 与  B.*(X[ii]+ j) 等效。

11.以下代码:
 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;}
输出答案为(答案用单个空格分隔) ( 2 5 )

 int a[5]={1,2,3,4,5}这是一维数组

&a是二维数组里面的结构已经类似于&a={(1,2,3,4,5),(0,0,0,0,0)}

(int*)(&a+1)已经指向了第二行的第一个元素可以等同于a[1][0]

因为二维数组是顺序摆放的,所以当ptr-1时相当于指向了a[0][4]

 12.以下代码:
   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;}
  输出答案 (  ).

定义数组的时候里头用的小括号( ),( )里头是逗号表达式只算最后一个数,所以二维数组其实是  1 3 5 0 0 0.

p= a[0];  p[0]即a[0][0]=1

13.简述结构体和共用体的区别.

结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

14.下述四个定义有什么区别?

  1.  char *const p;
  2.  char const *p;
  3.  const char *p;
  4. char const * const p;

 第一个: char * const p是指向char的常指针, 指针需在声明时就初始化, 之后不可以改变它的指向.

第二个和第三个是一样的, p都是指向const char类型的指针, 不可以赋值给*p, 就是不可通过这个指针改变它指向的值.

第四个char const * const p; 相当于 const char * const p ,声明一个指向字符或字符串的指针常量,不可以修改p的值,也就是地址不可以修改,也不可以修改p指向的内容。

15.通过键输入两整型量a和b定义两个指针变量p1相p2指向整型变量a和b,然后a和b相互比较大小,a若小于b,则调用函数swap实现a和b两数交换然后再按从小到大数序输出。(拍照上传)

#include
void swap(int *p1,int *p2)
{
	int t;
	t=*p1;
	*p1=*p2;
	*p2=t;
}
int main()
{
	int a,b;
	scanf("%d %d",&a,&b);
	int *p1,*p2;
	p1=&a;
	p2=&b;
	if(*p1<*p2)
	{
        swap(p1,p2);
        printf("%d %d",*p2,*p1);
    }
	else
	    printf("%d %d",*p2,*p1);
	return 0;
 } 

总结

考核整体看来不是特别难,但是我还是存在特别大的问题,部分是粗心,但更多的是对知识的细节掌握不够。只会一些常见的基本操作用法,希望以后会多了解。

你可能感兴趣的:(c语言)