一、判断题(对的写T,错的写F并说明原因,每小题4分,共20分)
1、有数组定义int a[2][2]={{1},{2,3}};则a[0][1]的值为0。( )
MY Answer: T
2、int (*ptr) (),则ptr是一维数组的名字。( )
MY Answer: F. Ptr is an function pointer, which have no parameter and returns an int value.
3、指针在任何情况下都可进行>, <, >=, <=, = =运算。( )
MY Answer: F. The poiters have to pointer to the same array can do the aritheric operator.
4、switch(c) 语句中c可以是int, long, char, float, unsigned int 类型。( )
My Answer: F. The c can not be float type. 5、#define print(x) printf("the no, "#x",is ") My Answer: F.
二、填空题(共30分)
1、在windows下,写出运行结果,每空2分,共10分。
char str[ ]= "Hello";
char *p=str;
int n=10;
sizeof(str)=( )
My Answer: 6;
sizeof(p)=( )
My Answer:4
sizeof(n)=( )
My Answr:4/2 dependent on machine.
void func(char str[100]) { } sizeof(str)=( )
My Answer: 4
2、void setmemory(char **p, int num)
{ *p=(char *) malloc(num);}
void test(void) {
char *str=NULL;
getmemory(&str,100);
strcpy(str,"hello"); printf(str); }
运行test函数有什么结果?( hello, 但是每运行一次Test都会去申请一次内存空间,运行完毕内存空间并没有被释放,出现内存泄漏。运行多次后会出现内存耗尽,崩溃。 )10分
3、设int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf("%d,%d",*ptr,*(++ptr)); ( ) 10分
My Answer: 230,8
但是在VC中运行结果为:7.8. 实际上arr[0]为230,而不是arr[1]为230;
在VC中的Debug选项中,Disassambly可以看到汇编代码:
==================Source Code====================
int main(int argc, char* argv[]) { int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf("%d ",arr[0]);
printf("%d ",*ptr);
printf("%d ",*(++ptr));
return 0; }
=======================================================
汇编代码:
可以看到先计算在寄存器上先加。然后再进行指针运算。
二、编程题(第一小题20,第二小题30分) 1、 不使用库函数,编写函数int strcmp(char *source, char *dest) 相等返回0,不等返回-1; 2、 写一函数int fun(char *p)判断一字符串是否为回文,是返回1,不是返回0,出错返回-1 <script language=JavaScript type=text/javascript> document.write('
本文地址为: ' + window.location.href +''); document.close(); </script>
My Answer:
int strcomp(char* source, char *dest) { assert(source!=NULL&&dest!=NULL); char* tempsrc = source; char* tempdest = dest; int result = 65535; while(*tempsrc!='/0'&&*tempdest!='/0') { result = (*tempsrc++)-(*tempdest++); if(result!=0) return result>0 ? 1 : -1; } if(*tempsrc=='/0'&&*tempdest!='/0') return -1; else if(*tempsrc!='/0' && *tempdest=='/0') return 1; else return 0; }
测试程序:
#include "stdafx.h" #include "assert.h" int strcomp(char* source, char *dest); int main(int argc, char* argv[]) { char *str = "abcd"; char *dest ="abcd"; printf("%d ",strcomp(str,dest)); return 0; }
2. 应该定义的有长度传入的。传入的字符串是末尾不含有‘/0'的。
int fun(char *p, int len) { if(p==NULL) return -1; if(len<=0) return -1; char *temp = p; char *dest = p+len-1; for(int i=0;i<len/2;++i) { if(*(temp+i)!=*(dest-i)) return 0; } return 1; }
测试代码:
#include "stdafx.h" #include "assert.h" int fun(char *p, int len); int main(int argc, char* argv[]) { char str[] = {'a','b','c','b','a'}; printf("%d",fun(str,5)); return 0; }