一、单选题【每题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;