一、选择题(每题2分,共 10 分)
1 "以下程序的运行结果是(B )
#include <stdio.h>
int func(int a,int b);
void main()
{ int k=4,m=1,p;
p=func(k,m); printf(""%d, "",p);
p=func(k,m); printf(""%d\n"",p); }
int func(int a,int b)
{ static int m=0,i=2;
i+=m+1;
m=i+a+b;
return m; }
A: 8,17, B: 8,17
C: 8,8 D: 4,1
2 设已有定义: int a[10]={15,12,7,31,47,20,16,28,13,19},*p; 下列语句中正确的是(B)
A: for(p=a;a<(p+10);a++); B: for(p=a;p<(a+10);p++);
C: for(p=a,a=a+10;p<a;p++); D: for(p=a;a<p+10; ++a);
3.设数组a[5]={10,20,30,40,50},已知指针p指向a[1];则表达式*++p的值是(C)
A,20 B,21 C.30 D.31
解析:++p使指针指向p[2],加*则是获取指针指向位置的值则为p[2]的值为30。
4.以下语句不能正确赋值的是(A)
A.char s1[10];s1=”china”
B.char s2[]={‘c’,’h’,’i’,’n’,’a’}
C.char s3[20]=”china”
D.char *s=”china”
解析:不能直接将一个字符串赋值给一个字符数组名,因为字符串字面量是一个常量指针,指向一个以 null 结尾的字符数组。
5.下面语句输出结果是(C)
Printf(“%d\n”,strlen(“\t\”\065\xff\n));
A.14 B.8 C.5 D.输出项不合法,无正常输出
解析:strlen遇到\0就计数结束。
二、简答题 40分
1.请简述字符串长度和字符数组长度的区别? 5分
答:字符串长度是指从字符串起始位置到\0结束符之前的字符数。字符数组长度是数组中包含的所有字符的数量。
2.break和continue有什么区别? 5分
答:break用于立即跳出最近的循环或者switch语句。continue则是结束本次循环,直接进入下一次循环。
3.下面的代码输出是什么?为什么? 5分
void foo(void)
{
unsigned int a=6;
int b=-20;
(a+b>6)?puts(“>6”):puts(“<=6”);
}
输出为“>6”,因为unsigned类型比和int类型做运算默认将int提升为unsigned类型。所以原本b=-20的符号位变为真值使得-20成为一个很大的正数,两者相加>6为真所以输出“>6”
4.类型定义 7分
用变量a给出下面的定义
- 一个整形数 int a;
- 一个指向整形数的指针 int *a;
- 一个指向指针的指针它指针的指针是指向一个整形数 int **a;
- 一个有10个整形输入的数组 int a[10];
- 一个有10个指针的数组,该指针是指向一个指向整型数的 int *a[10];
- 一个指向有10个整形数组的指针 int(*a)[10];
- 一个指向参数为int,float,返回值是int的函数指针int (*fun)(int,float);
5,请简述static ,const关键字的含义,需要说明const和指针的结合? 10分
static 为静态变量,具有延长生命周期的作用,静态局部变量定义时分配内存,程序结束才释放内存,只赋初值一次。限制作用域 静态全局变量和静态函数只能在该文件内使用,不能被外部文件引用。定义未赋初值,默认值是0。
const为为修饰变量,表示为常量。不会轻易改变。
const修饰指针,需要观察 const 与 * 的位置关系,位置不同,作用不同。
1.cont int *p; 或者 int const *p 可以修改地址、不可以修改值
2.int * conts p; 不可以修改地址、可以修改值
3.conts int * const p; 值和地址都不可以修改
6.解读程序,请问执行Test函数会有什么执行结果? 8分
char *GetMemory(void)
{
char p[]=”hello world”;
return p;
}
void Test(void)
{
char *str=NULL;
str=GetMemory();
puts(str);
}
输出乱码字符串。函数GetMemory返回的是局部数组的地址,数组在函数结束后会被释放,指针指向的地址会失效成为野指针。
三、编程题(共5题,每题10分)
1.已知strcmp的函数原型int strcmp(const char *s1,const char *s2)不调用C字符串函数库,请编写函数strcmp。
int Newstrcmp(char *s1,char *s2){ while(*s1==*s2){ // 如果当前字符是字符串的结束符'\0',则两个字符串相等或同时到达末尾 if(*s1=='\0'||*s2=='\0'){ //跳出循环 break; } s1++; s2++; } // 循环结束后,返回两个字符串当前字符的差值 // 如果s1的当前字符小于s2的当前字符,返回负数 // 如果s1的当前字符大于s2的当前字符,返回正数 // 如果两者都是'\0',即同时到达字符串末尾,则返回0 return *s1-*s2; }
2.编写程序,实现字符串逆置,char *strrev(char *str),参数str是要逆置字符串的首地址,返回逆置后字符串首地址。
char *nz(char *str); int main(int argc, const char *argv[]) { printf("请输入一个字符串:"); char str[100]; scanf("%s",str); nz(str); printf("逆序排列后的字符串为:%s",str); return 0; } char *nz(char *str){ int len =strlen(str); for(int i=0;i<len/2;i++){ char temp; temp=str[i]; str[i]=str[len-1-i]; str[len-1-i]=temp; } return str; }
3.通过二维数组实现杨慧三角void YangHui(int n,int (*p)[n])
4.请简述什么是冒泡排序,并变成实现冒泡排序?void Bubble(int n,int *p)
冒泡排序:相邻两个元素,比较,两两比较逆序交换位置,每一趟确定一个数的位置。假设有n元素则需走n-1趟才能排序完成。
void maopao(int n,int *p); int main(int argc, const char *argv[]) { printf("请输入您要输入的数组元素个数:\n"); int n; scanf("%d",&n); int a[100]; printf("请输入数组元素中间用空格隔开:\n"); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } maopao(n,a); for(int i=0;i<n;i++){ printf("%2d",a[i]); } return 0; } void maopao(int n,int *p){ for(int i=0;i<n-1;i++){ for(int j=0;j<n-1-i;j++){ int temp; if(p[j]>p[j+1]){ temp = p[j]; p[j]=p[j+1]; p[j+1]=temp; } } } }
5.请递归实现n!
int fun(int n) { if (n == 0 || n == 1) { return 1; } return n *fun(n - 1); } #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) { int n=5; int jiech; jiech=fun(n); printf("%d的阶乘值为%d",n,jiech); return 0; }