会计考友 发表于 2012-8-2 09:08:23

2011软考软件设计师练习题:第五章及解答

 5.1单项选择题
  1.设有定义“int a=3, b,*p=&a;”,则下列语句中使 b不为3的语句是(   )
  ① b=* &a;   ② b=* p;
  ③ b=a;   ④ b=*a;
  【解】定义有 int a=3, b,*p=&a;对b赋值的表达式有*&a、*p、a 、*a。引用变量。的值有两种方法,一是直接引用a,二是通过a的指针间接引用a。对于后者,又有多种表达方法,通过指向a的指针p,间接引用a的内容,如*p。或通过求地址运算符由变量a得到其指针&a,再由这指针表达式间接引用 a的内容,如* &a。所以表达式*&a、*p和a都能引用变量a的值,而使b的值为3。而表达式。a是错误的,因为a不是指针变量,不能对它施行取内容运算符。。所以解答是④。
  2 .设指针x指向的整型变量值为万,则"printf("%d\n",++ *x);"的输出是()
  ① 23          ② 24         ③ 25         ④ 26
  【解】若指针变量x指向某个变量,例如指向变量v,并且变量v的值是25,则表达式++ *x的值是26。这是因为表达式的计算顺序可加圆括号表达成(++(*x)),首先是*x,是对X所指变量V的引用,所以++ *X就是++V。++V是先让变量V增1,并以增至后的V的值为表达式++V的结果,所以其值是 26。所以解答是④。
  3.若有说明:“ int i,j= 7,*p=&i;”,则与“ i=j;”等价的语句是()
  ①i=*p;          ②*P=* &j;
  ③i==&j;         ④i=* *p;
  【解】指针变量 p指向变量i时,表达式i=*p等价于 i=i;表达式*p=*&j等价于i=j;而表达式i=&j企图将整型变量的指针赋给整型变量,这是错误的;表达式i=* *p也是一种错误的表达式。p是指针,*p是p所指变量j,* *p是企图将整型变量j当作指针,并想通过j间接引用某个变量。所以解答是②。
  4.若有说明语句“int a,*p=a;”,对数组元素的正确引用是()
  ①a             ②P
  ③*(P+2)            ④P+2
  【解】在 C语言中,约定数组名单独出现在表达式中时,它表示数组首元素的指针。有int a ,则a可以作为&a使用。另有整型指针变量p,代码p=a实现p指向数组a的首元素。则表达式*(p+2)是引用数组元素a。表达式a和p都是不正确的,下标必须是整型表达式,不可以是指针表达式。表达式p+2是指针表达式,它的值是&p。所以只有表达式*(p+2)引用数组a的元素a。所以解答是③。
  5.下面各语句中,能正确进行赋字符串操作的语句是()
  ①char s ={"ABCDE"};            ②char s ={’A’,’B’,’C’,’D’,’E’};
  ③ char *s;s="ABCDE";         ④ char *s;scanf("%", s);
  【解】字符串最终存储于字符数组中,存储字符串的字符数组可以是程序主动引入的(定义或动态分配),也可以是字符串常量,由系统分配。其中字符数组用字符串初始化就是字符串存储于由程序引入的字符数组的例子。给字符指针赋字符串则是系统自动分配字符率存储空间的例子。给字符指针赋字符串并不是将一个长长的字符串存于字符指针变量中,而是将字符串常量存储于常量区,并将存储这个字符串的首字节地址赋给指针变量,让指针变量指向字符率常量的首字符。对于以字符串作为字符数组初值的情况,要求字符数组足够的大,能存得下字符串常量。这里有一个特别的规定,若数组的大小少于存储字符串有效字符的字节个数,系统将报告错误;当字符数组的大小只能存储字符串的有效字符,而不能存储字符率结束标记符时,则存储于字符数组中的内容是字符序列,因没有存储字符率结束标记符,存储的内容就不是字符串。如代码char a="ABCDE"。另外,给字符数组元素逐一赋字符初值,并在字符初值中没有字符串结束标记符,则存于字符数组中的内容也不是字符率。如代码 char s={’A’,’B’,’C’,’D’,’E’}。特别要注意当字符指针还未指向某个字符数组的元素时,不可以通过字符指针输入字符串。如代码char *s;scanf("%s",s)。若写成char *str;scanf("%s",&str)更是错误的了。由于C语言规定数组不能相互赋值,所以只能将字符串常量赋给某字符指针。如代码char *s;s="ABCDE"是正确的。实际上,字符率"ABCDE" 被存储于常量区中,向指针变量赋的是字符指针,让s指向其中的字符’A’。所以解答是③。

会计考友 发表于 2012-8-2 09:08:24

2011软考软件设计师练习题:第五章及解答

  6.若有以下定义,则不能表示a数组元素的表达式是()
  int a={1,2,3,4,5,6,7,8,9,1o},*p=a;
  ①*p         ② a             ③*a            ④ a
  【解】上述代码定义了有10个元素的整型数组。,和定义指针变量p,并让p指向数组元素a。所以代码*p是引用 a。由于数组a只有10个元素,最后一个元素是a,表达式a是错误的。数组名a可以作为a的首元素的指针,表达式*a就是a ,是对数组a的首元素a的引用。指针p的值是a,表达式p-a。的值是0,所以a就是a。所以解答是②。
  7.若有以下定义,则值为3的表达式是()
  int a[]= {1,2,3,4,5,6,7,8,9,10},*p=a;
  ①p+=2,*(p++)         ③p+=2,* ++p
  ③p+=3,*p++         ④ p+=2,++ *p
  【解】数组a有10个元素,分别有值1至10,指针变量p指向a ①逗号表达式 p+=2,*(P++),先是P+=2使P指向a,接着是*(P++),以当时P所指变量a取内容3为表达式的值,同时使p指向a。②返号表达式p+=2,* ++p,先是p+=2使p指向a,以后是* ++p,又使 p增1,让它指向a,并取指针p所指变量a的内容4作为表达
  式的值。③逗号表达式 p+=3,*p++,先是p+=3使p指向a,以后是*p++,表达式的值是 a为 4,而使p指向a。④逗号表达式p+=2,++ *p,先是p+=2,使p指向a,以后是++ *p,因当时的*p就是 a,++a使a增1,变成4,并以4为表达式的值。所以只有p+=2,*(p++)的值是3。所以解答是①。
  8.设有定义“char a={"abcd"},*p=a;",则*(p+4)的值是()
  ①"abCd"            ②’d’
  ③’\0’            ④不能确定
  【解】若有char a="abcd",*p=a,则指针变量p指向a。在表达式*(p+4)中,p+4指向a,*(p+4)就是a。由于用字符"abcd" 给字符数组a赋初值,a的值是字符串结束标记符’\0’。所以解答是③。
  9.设有代码"int(*ptr);”,其中的ptr是()
  ①10个指向整型变量的指针
  ②指向10个整型变量的函数指针
  ③一个指向具有10个元素的一维数组的指针
  ④具有10个指针元素的一维数组
  【解】代码“int(*ptr);”的分析过程是,因圆括号,括号内的ptr先与字符*结合,字符*修饰标识符ptr是一种指针;接着与后面的一对方括号结合,表示是这样的一种指针,是指向一维数组的;再有方括号中的10,说明这种数组有10个元素。至此,ptr是指向含10个元素的
  一维数组的指针。最后,是最前面的int,表示数组元素是int类型的。所以,ptr是一个指向具有10个int型元素的一维数组的指针。所以解答是③。另外,要是①,10个指向整型变量的指针,就是一个指针数组,上述代码应写成“int *ptr;”,即ptr是一个有10个指向整型变量的数组。要是②,返回值是指向10个整型变量的函数的指针,上述代码应写成“int(*(*ptr)());”,即ptr是指针,指向一种函数,函数的返回值又是一种指针,指向10个元素的数组,数组的元素是整型的。下面的代码是这样的函数指针和函数的例子:
  # include
  int a[]={{1,2,3,4,5,6,7,8,9,0} ,{0,1,2,3,4,5,6,7,8,9} };
  int(*(*ptr)(int));
  int(*f( int n))
  {return a+n;
  }
  void main()
  { int(*p),*q;
  ptr=f;/*让ptr指向函数f*/
  P=(*ptr)(0);
  q=*p;
  printf("%d\n", *p);
  P=(*ptr)(l);
  q=*p;
  printf("%d\n", *q);
  }
  在上述代码中,函数有一个int型的形参。要是④,其意义与①相同,上述代码应写成“int* ptr;”,即 ptr是一个有10个元素的数组,数组元素是指向整型变量的指针。
  10.若有以下定义,则数值为4的表达式是()
  int w={{0,1},{2,4},{5,8}},(* p)= W;
  ①*w+l          ②p++,*(p+1)         ③w                ④p
  【解】二维数组定义有多种赋初值的办法,问题给出的代码是按行给数组的部分元素赋初值。它们分别是w=0.w=1、w=2.w=4,w=5,w=8。根据约定,未指定初值的元素自动置全0值。指针变量p是一个指向具有四个int型元素的一维数组的指针,定义时的初值使它指向数组W的第一行。①的代码,*w+1中的W是指向 w的指针,*w 就是w,其值是2,*w+l的值是3。②的代码是逗号表达式,“p++,*(p+1)”先使p指向数组w的第二行,*(p+l)中的p+l是指向数组w的第三行,*(p+1)是指针值,指向数组w的第三行的第一个元素,即&w. ③的代码w引用数组W第三行的第三列元素,其值是0。④的代码p引用数组W第二行的第二列元素w,其值是 4。所以解答是@。

会计考友 发表于 2012-8-2 09:08:25

2011软考软件设计师练习题:第五章及解答

  11.若有下面的程序片段,则对数组元素的错误弓D用是()
  int a={0},*p,* *pp,i;
  for( i=0;i

会计考友 发表于 2012-8-2 09:08:26

2011软考软件设计师练习题:第五章及解答

  7.设有以下定义和语句,则*(*(p+2)+l)的值为__________。
  int a={10,20,30,40,50,60},(*p);
  p= a;
  【解】上述代码定义3行2列的二维数组a ,定义指向两个元素的一维数组指针p,并让p指向二维数组a的首行。则代码*(*(p+2)+l)中的p+2指向二维数组a的第2行a,*(p+2)指向a,*(p+2)+l指向a,*(*(p+2)+l)是引用a,其值是60。
  8.以下程序的功能是从键盘上输入若干个字符(以回车符作为结束)组成一个字符串存入一个字符数组,然后输出该字符数组中的字符串。请填空。
  # include
  # include
  main()
  { char str,*sptr;
  int i;
  for(i=0;i

会计考友 发表于 2012-8-2 09:08:27

2011软考软件设计师练习题:第五章及解答

  # include
  main()
  { int x,y,z;
  int *big=&x,*mid=&y,*sma=&z,/*置三个指针变量分别指向x,y, z*/
  *temp;
  printf("Enter x,y,z.\n");
  scanf("%d%d%d", big,mid,sma);/*顺序为变量x,y,z输入值*/
  if(*big< *mid) {temp=big;big=mid; mid=temp; }/*使*big>=*mid*/
  if(*big=*sma*/
  if(*mid=*sma*/
  printf("%d\t%d\t%d\n", x,y,z);/*按输入顺序输出x,y,z*/
  printf("%d\t%d\t%d\n",*big,*mid,*sma);/*按从大到小的顺序输出*/
  }
  2.编一个程序,输入15个整数存入一维数组,再按逆序重新存放后再输出。
  【解】输入数组的元素,并重新颠倒存放后输出。将存储于数组中的元素颠倒存储,只要首尾相对应的元素两两交换即可。若用指针实现,可让一个指针p指向前端的元素,另一个指针q指向与前端元素对应的后端的元素。循环前,让p指向数组的首元素,让q指向数组的末元素。循环时,让p和q所指两个元素交换,并让p增1,q减l。循环条件是p所指元素在前,q所指元素在后,即p<q。程序如下:
  # include
  main()
  { int a,*p,*q, temp;
  printf("Enter 15 numbers.\n");
  for(p=a;p<a+15;p++)
  scanf("%d", p);
  for(p=a,q=a+14;p<q;P++,q--) {
  temp=*p; *p=*q;*q=temp;
  }
  for(p=a;p      printf("%d\t",*p);
  printf("\n");
  }</p>
  3.输入一个字符串,按相反的次序输出其中的全部字符。
  【解】要相反的次序输出字符串的全部字符,可用一个字符指针变量,从指向字符串的本字符开始,逆序遍历字符串,输出指针所指字符即可。但为了让字符指针指向字符串的末字符,若不用字符串处理库函数,得用一个循环,让它从字符串的首字符开始,顺序移至字符串的结束标记符,然后倒退一个字符,就能让它指向字符串的末字符。程序如下:
  # include
  # define N 200
  main()
  { char s,*p;
  printf("Enter a string.\n");
  scanf("%s", s);
  for(p=s;*p; p++);
  for(p--; p>=s; p--)
  printf("%c",*p);
  printf("\n");
  }
  4.输入一个一维实型数组,输出其中的最大值、最小值和平均值。
  【解】设实型数组的元素个数n不超过20。程序输入n,并用循环输入数组的元素,再用循环遍历数组,求出数组的最大值和最小值、数组元素的和。然后求出数组元素的平均值,最后输出结果。程序如下:
  # include
  # define N 20
  main()
  { double a,max,min,ave,*p, t;
  int n;
  printf("Enter n(0<n<20).\n");
  do{
  scanf("%d",&n);
  if(n>0 && n

会计考友 发表于 2012-8-2 09:08:28

2011软考软件设计师练习题:第五章及解答

  for(i=1;i    for( p=ms,q=strs;*p! =’\0’ && *p==*q;p++,q++);
  if(*p
页: [1]
查看完整版本: 2011软考软件设计师练习题:第五章及解答