<计算数组和指针的内存容量
voidFunc(chara[100])
{
cout<
<}
11.变量的声明和定义有什么区别?
答:
声明变量不分配空间,定义变量要分配空间。
声明主要是告诉编译器,后面的引用都按声明的格式。
定义其实包含了声明的意思,同时要分配内存空间。
12.解释堆和栈的区别。
答:
堆(heap)——一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
速度比较慢,而且容易产生内存碎片,不过用起来最方便。
栈(stack)——由编译器自动分配释放,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈。
由系统自动分配,速度较快。
但程序员是无法控制的。
13.const的作用是什么?
答:
(1)可以定义const常量
(2)const可以修饰函数的参数、返回值,甚至函数的定义体。
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
14.下列哪两个是等同的
intb;
Aconstint*a=&b;//指向常量的指针,不能通过指针改变b,但指针的地址可以改变。
Bconst*inta=&b;//指针的地址不可以改变,但可以通过指针改变b的值
Cconstint*consta=&b;//指针指向的值,和指针本身的地址都不能改变
Dintconst*consta=&b;//与c相同
15.完成程序,实现对数组的降序排序
#include
voidsort(intarray[]);
intmain()
{
intarray[]={45,56,76,234,1,34,23,2,3};//数字任//意给出
sort(array);
return0;
}
voidsort(intarray[])
{____________________________________
inti,j,k;
for(i=1;i<=7;i++){if(array[i]>array[i-1])
{
k=ARRAY[i];
j=i-1;
do
{
array[j+1]=array[j];
j–;
}
while(k>array[j]&&j>=0);
array[j+1]=k;
}
}
—————————————————–
}
16.inti=(j=4,k=8,l=16,m=32);printf(“%d”,i);输出是多少?
答:
相当于i=j=4;i=k=8;i=l=16;i=m=32;故最后i=32;
17.请简述以下两个for循环的优缺点(5分)
1)for(i=0;i
{
if(condition)
DoSomething();
else
DoOtherthing();
}
2)if(condition)
{
for(i=0;i
DoSomething();
}
else
{
for(i=0;i0)
{
*psTo++=*psFrom++;
}
returnpvTo;
}
19..C++里面如何声明constvoidf(void)函数为C程序中的库函数?
答:
在该函数前添加extern“C”声明。
由于编译后的名字不同,C++程序不能直接调用C函数。
20.请写出下面代码在32位平台上的运行结果,并说明sizeof的性质:
#include
#include
intmain(void)
{
chara[30];
char*b=(char*)malloc(20*sizeof(char));
printf(“%d\n”,sizeof(a));
printf(“%d\n”,sizeof(b));
printf(“%d\n”,sizeof(a[3]));
printf(“%d\n”,sizeof(b+3));
printf(“%d\n”,sizeof(*(b+4)));
return0;
}
答:
在32位系统下(如WIN32),指针长度为32位。
a是一个有30个元素的字符型数组;b是一个字符串指针;a[3]是字符型;b+3是指针;*(b+4)是字符型。
因此输出:
30、4、1、4、1
21.C++中,关键字struct和class的区别仅仅在于:
struct定义的类的缺省成员为公有的,而class定义的类的缺省成员为私有的;
22.头文件的作用是什么?
答:
1)通过头文件来调用库功能。
2)头文件能加强类型安全检查。
23.C++函数中值的传递方式有哪几种?
答:
C++函数的三种传递方式为:
值传递、指针传递和引用传递。
24.内存的分配方式的分配方式有几种?
答:
1)从静态存储区域分配。
内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。
例如全局变量。
2)在栈上创建。
在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。
栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3)从堆上分配,亦称动态内存分配。
程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。
动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
25.设计函数intatoi(char*s)。
答:
intatoi(char*s)
{
inti=0,sum=0,sign;//输入的数前面可能还有空格或制表符应加判断
while(*s==”||*s==’\t’)
{
i++;
}
sign=(*s==’-')?
-1:
1;
if(*s==’-'||*s==’+')
{
i++;
}
while(*s!
=’\0′)
{
sum=*s-’0′+sum*10;
i++;
}
returnsign*sum;
}
26.编写strcat函数(6分)
已知strcat函数的原型是char*strcat(char*strDest,constchar*strSrc);
其中strDest是目的字符串,strSrc是源字符串。
(1)不调用C++/C的字符串库函数,请编写函数strcat
答:
char*__cdeclstrcat(char*dst,constchar*src)
{
char*cp=dst;
while(*cp)
cp++;/*findendofdst*/
while(*cp++=*src++);/*Copysrctoendofdst*/
return(dst);/*returndst*/
}
(2)strcat能把strSrc的内容连接到strDest,为什么还要char*类型的返回值?
答:
方便赋值给其他变量。
27.MFC中CString是类型安全类么?
答:
不是,其它数据类型转换到CString可以使用CString的成员函数Format来转换
28.函数模板与类模板有什么区别?
答:
函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定。
29.写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。
答:
#defineMIN(A,B)((A)<=(B)?
(A):
(B))宏的副作用(与某些函数的混淆):
least=MIN(*p++,b)。
宏定义#defineMIN(A,B)((A)<=(B)?
(A):
(B))对MIN(*p++,b)的作用结果是:
((*p++)<=(b)?
(*p++):
(*p++))
30.嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
答:
while
(1){}或者for(;;)
31.用变量a给出下面的定义
a)一个整型数(Aninteger)
b)一个指向整型数的指针(Apointertoaninteger)
c)一个指向指针的的指针,它指向的指针是指向一个整型数(Apointertoapointertoaninteger)
d)一个有10个整型数的数组(Anarrayof10integers)
e)一个有10个指针的数组,该指针是指向一个整型数的(Anarrayof10pointerstointegers)
f)一个指向有10个整型数数组的指针(Apointertoanarrayof10integers)
g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(Apointertoafunctionthattakesanintegerasanargumentandreturnsaninteger)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(Anarrayoftenpointerstofunctionsthattakeanintegerargumentandreturnaninteger)
答案是:
a)inta;//Aninteger
b)int*a;//Apointertoaninteger
c)int**a;//Apointertoapointertoaninteger
d)inta[10];//Anarrayof10integers
e)int*a[10];//Anarrayof10pointerstointegers
f)int(*a)[10];//Apointertoanarrayof10integers
g)int(*a)(int);//Apointertoafunctionathattakesanintegerargumentandreturnsaninteger
h)int(*a[10])(int);//Anarrayof10pointerstofunctionsthattakeanintegerargumentandreturnaninteger
32.1)关键字static的作用是什么?
答:
(1)用于全局变量;
(2)用于局部变量;(3)用于函数。
2)关键字const有什么含意?
答:
表示常量不可以修改的变量。
33.如何判断一段程序是由C编译程序还是由C++编译程序编译的?
答案:
#ifdef__cplusplus
cout<<"c++";
#else
cout<<"c";
#endif
34.数组a[N],存放了1至N-1个数,其中某个数重复一次。
写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:
intdo_dup(inta[],intN)
答案:
如果数就是1-N-1,那么求出a[N]的和,然后减去1-N-1就行了。
(确定数字1-N)
S=N*(N-1)/2;
inti;
ints=0;
for(i=0;i{
s+=a[i];
}
intres=s–S;
35.程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。
在这种情况下,可以将所有包含文件预编译为一个预编译头。
char*constp;
charconst*p
constchar*p
上述三个有什么区别?
答:
char*constp;//常量指针,p的值不可以修改
charconst*p;//指向常量的指针,指向的常量值不可以改
constchar*p;//和charconst*p
36.有1,2,….一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O
(1),使用交换,而且一次只能交换两个数。
#include
intmain()
{
inta[]={10,6,9,5,2,8,4,7,1,3};
intlen=sizeof(a)/sizeof(int);
inttemp;
for(inti=0;i
{
temp=a[a[i]–1];
a[a[i]–1]=a[i];
a[i]=temp;
if(a[i]==i+1)
i++;
}
for(intj=0;j
cout<return0;
}
37.写一个函数比较两个字符串str1和str2的大小,若相等返回0,若str1大于str2返回1,若str1小于str2返回-1
intstrcmp(constchar*src,constchar*dst)
{
intret=0;
while(!
(ret=*(unsignedchar*)src–*(unsignedchar*)dst)&&*dst)//字符之差为整型
{
++src;
++dst;
}
if(ret<0)ret=-1;elseif(ret>0)
ret=1;
return(ret);
}
38.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
答:
#defineSECONDS_PER_YEAR(60*60*24*365)UL
39.Typedef在C语言中频繁用以声明一个已经存在的数据类型的同义字。
也可以用预处理器做类似的事。
例如,思考一下下面的例子:
#definedPSstructs*
typedefstructs*tPS;
以上两种情况的意图都是要定义dPS和tPS作为一个指向结构s指针。
哪种方法更好呢?
(如果有的话)为什么?
答:
typedef更好。
思考下面的例子:
dPSp1,p2;tPSp3,p4;
第一个扩展为:
structs*p1,p2;
上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。
第二个例子正确地定义了p3和p4两个指针。
40.C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?
inta=5,b=7,c;
c=a+++b;
答:
上面的代码被处理成:
c=a+++b;因此,这段代码持行后a=6,b=7,c=12。
41.char*ss=“0123456789″;
sizeof(ss)结果4//ss是指向字符串常量的字符指针
sizeof(*ss)结果1//*ss是第一个字符
charss[]=“0123456789″;
sizeof(ss)结果11//ss是数组,计算到\0位置,因此是10+1
sizeof(*ss)结果1//*ss是第一个字符
charss[100]=“0123456789″;
sizeof(ss)结果是100//ss表示在内存中的大小100×1
intss[100]=“0123456789″;
sizeof(ss)结果400//ss表示再内存中的大小100×4
charq[]=”abc”;
charp[]=”a\n”;
sizeof(q),sizeof(p),strlen(q),strlen(p); 结果是4332
42.冒泡法:
//从小到大排序,比较n次,每次拿一个从头比到尾
voidbubble_sort(intarray[],intn)
{
inti,j,temp;
for(i=0;i{
for(j=0;jarray[j+1])
{temp=array[j];array[j]=array[j+1];array[j+1]=temp;}
}
printf(“%d“,array[j]);
}
return;
}
选择排序法:
main()
{
inta[10];
inti,j,t,k;
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);//输入10个数
for(i=0;i<9;i++)
{
k=i;
for(j=i+1;j<10;j++) if(a[k]>a[j])
k=j;//前进
if(k!
=i)
{t=a[i];a[i]=a[k];a[k]=t;}/*t发放奖品*/
}
for(i=9;i>=0;i–)
printf(“%4d”,a[i]);/*显示排序后的结果*/
}
C语言笔试题
(1)
第1题:
完成文件的拷贝,srcFileName为源文件名,dstFileName为目标文件名。
intcopy_file(constchar*srcFileName,constchar*dstFileName);
第2题:
设有文件a.file,请写出程序在文件的开头插入字符串“filestart:
”;
第3题:
已知
unionun{
shorts;
chara[3];
};
求sizeof(unionun)?
第4题:
请描述以下代码中的p,
char(*(*p())[])(int,void(*)())
第5题:
已知
unionun{
shorts;
chara[3];
};
求sizeof(unionun)?
C语言笔试题
(2)
第1题:
已知chara[]=“abc\0efg”,求sizeof(a)和strlen(a);
第2题:
1,写程序完成M进制转N进制,M、N为1~10之间。
mton(constchar*mNum,intm,char*nNum,intn);
第3题:
完成16进制字符串相加,返回相加后的16进制字符串。
char*sum_str16(constchar*str1,const