测试题

一:填空(共28分)

1.(2分)struct AA{

char a;//0

char b[2];//1,2

short c;//4 5

int d; //8 9 10 12

};  

       请问sizeof(struct AA)是___12_结构体起始地址就是第一个成员的起始地址__。

 

   2. (2分 )struct BB{

char a;//0

short b[2];//2,3,4,5

char c;//6

int d;//8,9,10,11

};  

请问sizeof(struct BB)是___12___。

 

   3. (6分)  

   int *p = NULL;

       int main()

       {

int i = 3;

static int a = 5;

int *p1= NULL;

p = &a;

*p = i;

p1 = (int *)malloc(5 *sizeof(int));

i++;

 

printf(“%d, %d\n”, a, i);

return 0;

       }

在32位系统中,内存分为:数据域,栈,堆等。则指针变量p,p1所指向的区域分别存储在(.data),(堆区);变量 i,a分别存储于(栈区),(.data);printf打印的结果(3),(4);

栈区:函数参数,动态局部变量;

堆区:动态内存;

数据域:全局变量,和静态局部变量

文字常量区:常量字符串

程序代码区:函数体的二进制代码

 

 

4.(2分)const的用法,至少两种?

1.修饰函数参数,表明这个参数不可更改。

2.修饰普通变量,表明此变量不可更改。

3.修饰指针变量。(详见博客const

 

 

  1. (2分)  static的用法,至少两种?

1限定变量的作用域 2.改变变量的生存期(存储域)

 

6.(4分)1)定义一个3列4行int类型元素数组;

        int a[4][3];

            2)一个指向函数的指针,该函数有一个void型 指针参数并返回一个void型指针;void*p*)(void*

 

  7.(4分)32位系统中char*p = NULL;int a[10] = {0};假设     int  a[10]变量的起始地址是0x10000;指针变量(本身)的地址是 0x20000;char *p = (char *)a; 则:

       p+1值(0x10001);&p+1值:(0x20004);//p的地址的值加1

 

a+1值: (0x10004);  

&a+1值: (0x10028);//&a相当于存放a  数组指针 的地址,指向该数组之后的空间

 

 

8.(2分)写出float x与“零值”的比较( if(x<0.000001)&&(x>-0.000001) )。

 

9.(2分)使用宏定义写出int类型最大值。

#define  INT  ~(1<<(sizeof (int)*8-1))

#define INT_SIZE  ((unsigned int)~0)>>1

 

10.(2分)以下程序是否有误,如果无误,请写出执行次数(  1)。

int x = -1;

do{

x = x * x;

}while(!x);

 

 

 

 

二:判断(共10分)

1(1分)#include<stdio.h>  

int main(void) {     

char *ptr = "Linux";     

*ptr = 'T';      

printf("\n [%s] \n", ptr);      

return 0; 

}.  

程序输出 Tinux:

//字符串常量不可改变,段错误

2(1分)定义一个指针变量,该指针变量指向一个具有10个整型指针元素的数组是: int *  array  [10];

int**arry[10];

3(1分)以下都是正确的标识符:Char, Short, If,CASE.

//标识符都是用户自己定义的,不能是系统定义的关键字,系统区分大小写

4(1分)有语句char str1[10],str2[10]={"china"};则能将字符   串china赋给数组str1的正确语句是strcpy(str2,str1)

strcpystr1str2//碰到‘\0’字符结束,源字符串作为后面的参数

  5.(1分)在大端系统中,int类型的1内存中存储的是0x1在   高字节。//0x1 是低字节数据,在大端系统中存放在高字节内存中

  6.(1分)有数组定义inta[2][3] = {{1}, {2,3}};则a[0][1]的值 为0. 

  7.(1分)声明函数int fun(int a[10]);则a表示一维数组变量名。错

一维数组做函数参数,数组名仅仅代表一个地址,不代表数组?怎么表述

  8.(1分)char *p = “hello”,  char str[] = “hello”;表示指针变量 p和str 都指向文字常量“hello//p指向文字常量区,而str指向栈区,系统在栈区分配了一段内存空间存放从文字常量去复制的字符串“hello

  9(1分)程序的局部变量都存放在栈中。静态局部变量在数据域中

 10(1分)switch(c)语句中c可以是int, float, char, long    类型。//float 不可作为c放在switch()的小括号内

 

三:(36)语法及分析

1.(2分)写一个宏,求之中比较大的数:________.

#define  MAXab)  (a>b)  ? a:b;

2. (2分)写一个宏判断一个变量是不是无符号数:________. 

#define  SIGNEDval) (val<0) ? 1:((~val>=0)?0:1 )

3.(2分)下面的语句输出的结果是____c语言没有规定计算顺序,answer的值不定,*p = 4,在可移植操作系统中有什么问题___不同的编译平台_answer的值不定_(-5)___。

#include <stdio.h>

int *p = NULL;//

int func ( void ) {

static int counter = 1;//静态变量在循环函数里面只会被初始化一次

   P = &counter;

return counter++;//先返回counter的值然后执行++

}

int main ( void ) {

int answer;

answer = func() - func()*func();

printf("%d, %d\n",answer, *p);

return 0;

}

 

 

4.(2分)下面函数定义有没有错误或者漏洞?如果有,如何修改?

#include <stdio.h>

void showArray( int array [10] ) {//数组指定大小没意义

int i;

for (i = 1; i< 10; i+=1)

if ( array[i] >10 ) 

printf("%d\n",array[i]);

}    

5.(2分)下面函数定义有没有错误或者漏洞?如果有,为什么,如何修改?             

int main()

{   

            char a[5];//长度太短    

          char *str = a;  

            strcpy(str,"hello");    

          printf(str);//双引号也是相当于一个字符串的首地址开始打印和指针一个效果

   //printf (“%s\n”,str);   

          return 0;         

  }

6.(2分)请问下面的代码的输出结果是

#include <stdio.h>

int main ( void ) {

int i = 6;

int a[5] = {1,2,3,4,5};

char * p = (char * )(&a +1);//&a+1相当于指向了a数组的后面一个内存单元。因为p指向的内存单元存放的是char类型数,所以p-1指向a[4]的高字节

printf("%d,  %d",*(a+1),*(p-1));//2 , 0

}

7.(2分)请问下面的代码的输出结果是

 int main(){

int a[6],*i,*p=a,*t=a;

printf("qing shu ru shu ju:\n");

for(i=a;i<a+6;i++){

scanf("%d",i);

}

        for(i=a;i<a+6;i++){

  *p=*i+*t;

  printf("%4d",*p);

  }

 }

 输入:1 2 3 4 5 6

 输出:2 3 4 5 6 7

8(2分)请问下面的代码的输出结果是

int main ( void ) {

unsigned int a = 6;

int b = - 20;

(a+b)>0?puts(">0"):puts("<=0");//类型转换

}

>0

 

   9.(2分)

#define N 2

     #define NTI(n)  N*n + n

int sum = N * NTI(N + 1);

问sum为多少(12)。

10.4分)写出下列程序输出结果(  )

#include <stdio.h>

int count 1= 3; 

int main() 

int i, sum, count2 = 2; 

for(i = 0, sum = 0; i < count2; i += 2,count2++) //2ci xp hr

static int count 3; //静态变量的定义语句只能执行一次   count3 = 4

count3++; 

if(i % 2 == 0) 

extern int count1; //extern限定count1引用的是函数外部,或文件外部的同名变量。Int不可少,防止变量类型重置。

count1++; 

sum  += count1; 

sum += count3; 

printf("%d, %d\n", count2, sum);

 

return 0; 

}   

 

 

 

11.6分)写出下列程序执行结果 ( )。(注,此处按行评判给分)

#include <stdio.h>

#include <string.h>

void func(char str[50])  

{  

  printf("%d, %d\n", sizeof(str), strlen(str)); //4传过来一个指针,

9指向的字符串从指向的地方开始到结束的长度,不包括‘\0

}  

int main()  

{  

  char stra[] = "HelloWorld"; //strlenstra)10 sizeofstra=11;

数组名代表整个数组的长度。

  char *strb = stra; //字符串数组可以直接赋给一个字符指针。 

printf("%d, %d\n", sizeof(stra), sizeof(strb++));//11,4sizeof()里面的表达式永不执行。

 

  func(++strb); //4,9,先把strb变量的值加1,就是指向字符串中的e

printf("%d, %d\n", sizeof(strb), strlen(strb++));//4,9

  return 0;  

12.(4分)写出下列程序输出结果(01209)

 

int func(int n)  

{  

   int k = 1;  

   if(n > 0)  

   {  

  k += func(--n);  

printf(“%d”, n);  

k += func(--n);  

   }  

   return k;  

}  

int main()  

{  

  int a = 3;  

  printf(“%d\n”, fun(a)); 

  return 0;  

}  //

 

 

13.(4)写出下列程序输出结果()

#include <stdio.h>

struct SC{int a,b,c;};  

struct SD{int a,b,c,d;};  

int main()  

{  

  struct SC c1[] = {{3,0,0}, {4,0,0}, {5,0,0}, {6,0,0}};  

  struct SD *c2 = (struct SD*)c1 + 1;  

  printf("%d,%d,%d,%d\n",c2->a,c2->b,c2->c,c2->d); //0 0 5 0

  return 0;  

}  

 

 

 

 

 

posted @ 2013-12-19 14:50  world——hello  阅读(451)  评论(0编辑  收藏  举报