简单的检测试卷

一、单选题【每题5分,共35分】

有以下程序段,int k=0; while( k=1 ) k++;则while循环执行的次数是( )

A. 一次也不执行                          B. 执行1次

B. 有语法错,不能执行              D. 无限次

答案:D

分析:while里面是赋值!!!不是判断的 “ == ” 所以他无限循环!!! 

下列关于静态局部变量的说法中,不正确的说法是( )

A. 静态局部变量在函数内定义

B. 静态局部变量的生存期为整个源程序

C. 静态局部变量的作用域为整个源程序

D. 静态局部变量若在说明时未赋初值,则系统自动赋予0值

答案:C

分析: 局部变量是只在当前函数内,只是一直能存在,只会等程序结束而结束

下列对 C 语言字符数组的描述中错误的是 ( )

A. 字符数组可以存放字符串

B. 字符数组中的字符串可以整体输入、输出

C. 不可以用关系运算符对字符数组中的字符串进行比较

D. 可以在赋值语句中通过赋值运算符 "=" 对字符数组整体赋值

答案:D

分析:字符数组整体赋值可以使用strcpy,不能直接赋值

数组声明为:short a[3][4],引用第3行第1列的元素写作________。

a. **(a+2)           b. *(*a+2)           c. a[3][1]             d. *(a[3]+1)

答案:A

分析:a 是 a[0] 的地址,所以 a + 2 是挪动行位置,则对其取值是取到了,a[2][0]的地址,再次取值是得到了其地址的值,B:取得是a[1][2]的值,D:取得是a[4][0]的地址,但是越界了

指针变量p1和p2类型相同,要使p1,p2指向同一个变量,正确的是________。

a. p2=*&p1        b. p2=**p1         c. p2=&p1           d. p2=*p1

答案:A

分析: A:取址再取值抵消,则p2=p1,B:**p1是对p1的取值在取值,但p1是一级指针无法取两次,C:p1是指针,对p1取址则p2应该是二级指针,但是p2是一级指针,D:p2是指针,*p1是值,不能相等

C语言在调用一个函数时,实参变量和形参变量之间的数据传递方式是( )

A. 地址传参                            B. 值传递

C. 由用户指定的方式            D. 由实参传给形参,并由形参传回来给实参

答案:B

分析:形参是虚拟的,当形参参与运算前会开辟一个临时空间, 将实参的值复制过去,再参与运算,运算完后形参会被清空,所以两个变量之间是值传递

有以下程序段, x=7执行后的值为 ( )

int fun(int x) {

int p;

if(x==0||x==1)

return(3);

    p=x-fun(x-2);

return p;

}

A. 0              B. 2              C. 5              D. 6

答案:B

分析:递归函数的结束点是x==0或者x==1;步长是2,所以运算的数字是7 5 3 1,当x==1时返回3,所以运算是7-5-3-3==2 

二、简答题【每题5分,共35分】

static关键字的作用是什么?

答案:延长生命周期,使变量从开始创建后,一直存在,贯穿整个程序,限制作用域,如果在文件内,主函数外,会限定在当前文件中,如果在文件内,函数内,会限定在函数内

定义数组int arr[10]; 说一下arr 和 &arr的区别是什么?

答案:在地址上,arr和&arr是一个地址,但是arr是指arr[0]的地址,当其增加的时候,会移动 int型 的字节大小的位置,也就是4个字节,而&arr是数组的地址,当其增加时,会移动整个数组的字节,也就是40个字节 

如何定义数组指针、指针数组、函数指针、指针函数?讲清楚它们的本质是什么?

答案:

数组指针:(*p)[],本质是指针,指向一个函数

指针数组:*p[],本质是数组,里面储存的是指针

函数指针:(*p)(),本质是指针,指向一个函数

指针函数: *p(),本质是函数,返回值是指针

const常量和宏常量哪个更好?尽可能多的列举。

答案:const常量更好

类型方面:const可以带数据类型,而define是一个常数,不带数据类型

作用阶段:const在编译和运行阶段起作用,define在预处理阶段起作用

作用方式:const会进行类型检查,define是简单的字符串替换

存储方式:const只储存一份,define定义的宏有若干备份

优点:const可以进行类型检查,const可以节约空间,避免不必要的内存分配

typedef和define的区别是什么?尽可能多的列举。

答案:

作用范围:typedef作用于特定的数据类型,define作用于整个函数中

处理方式:typedef是c语言语句,会在编译和运行阶段处理,define在预处理阶段展开

类型安全性:typedef可以进行类型检查,而define不行

值传递和地址传递的区别是什么?

答案:

地址传递形参变,实参也变,值传递,形参变,实参不变 

执行中报“段错误(核心已转储)”的原因是什么?

答案:访问的内存越界、访问的内存未分配、空指针引用、栈溢出、未初始化指针 

三、代码题【每题10分,共30分】

设计一个函数,判断计算机是大端存储还是小端存储?

#include<stdio.h>

int main(){
    
    int a = 0x12345678;
    char* p = (cahr*)&a
    if(*p == 0x78){
        printf("小端存储\n");
    }else
        printf("大端存储\n");
    return 0;
}

设计一个函数,实现字符串的逆置。(不限制算法)函数原型是 char *str_rev(char *s);     【注意返回值】

char *str_rev(char *s){
    
    char* p = s;
    char* q = s;
    while(*q != '\0'){
        q++;
    }
    q--;
    char temp;
    
    while(p < q){
        temp = *p;
        *p = *q;
        *q = temp;
    }
   
    return s;
}

写一个"标准"宏MAX,这个宏输入两个参数并返回较小的一个;

#define MAX(a,b) a>b?b:a;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值