文档库 最新最全的文档下载
当前位置:文档库 › C++笔试题打印版

C++笔试题打印版

C++笔试题打印版
C++笔试题打印版

C++笔试题

1.多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?

答案:虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而对象的隐藏成员--虚拟函数表指针是在运行期--也就是构造函数被调用时进行初始化的,这是实现多态的关键.

2.将一个1M -10M 的文件,逆序存储到另一个文件,就是前一个文件的最后一个字符存到新文件的第一个字符,以此类推。

//实现对一个文本文件内容的反向显示。

#include

#include

void main ( ){

char c;

FILE *fp;

if ((fp=fopen("test.txt","r")) == NULL) //以读方式打开文本文件

{ printf ("Cannot open file.\n");

exit(1);

}

fseek( fp, 0L, 2 ); //定位文件尾。注意此时并不是定位到文件的最后一字符,

//而是在定位文件最后一个字符之后的位置

while ((fseek(fp, -1L, 1))!=-1) // 相对当前位置退后一个字节

{

c=fgetc(fp); putchar (c); //如果定位成功,读取当前字符并显示

/* 读取字符成功,文件指针会自动移到下一字符位置*/

if (c=='\n') /* 若读入是\n字符*/

fseek(fp, -2L,1); /* 由于DOS在文本文件中要存回车0x0d和换*/

/* 行0x0a两个字符,故要向前移动两个字节*/

else fseek (fp, -1L, 1); /* 文件指针向前移动一个字节,使文*/

} /* 件指针定位在刚刚读出的那个字符*/

fclose (fp); /* 操作结束关闭文件*/

}

3.main主函数执行完毕后,是否可能会再执行一段代码?(朗讯的一道笔试题)

答案:可以,可以用_onexit 注册一个函数,它会在main 之后执行;

如果你需要加入一段在main退出后执行的代码,可以使用atexit()函数,注册一个函数。

语法:

#include

int atexit(void (*function")(void));

#include

#include

void fn1( void ), fn2( void ), fn3( void ), fn4( void );

int main( void ) {

atexit( fn1 );

atexit( fn2 );

atexit( fn3 );

atexit( fn4 );

printf( "This is executed first.\n" );

}

void fn1() {

printf( "next.\n" );

}

void fn2() {

printf( "executed " );

}

void fn3() {

printf( "is " );

}

void fn4()

printf( "This " );

}

结果:

This is executed first.

This is executed next.

4.一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?

在子类的空间里,有没有父类的这个函数,或者父类的私有变量? (华为笔试题)

答案:只要基类在定义成员函数时已经声明了virtue关键字,在派生类实现的时候覆盖该函数时,virtue关键字可加可不加,不影响多态的实现。子类的空间里有父类的所有变量(static除外)。

5.给一个字符串、例如“ababc”要求返回“ab”. 因为“ab”连续重复出现且最长。用C/C++语言写一函数完成该算法,给出复杂度

从对一个字符开始,假设其为最长的串的第一个,向后查找下一个与它相同的字符,确定单循环的长度,再验证是否是连续出现的(类似于循环节),如后面不重复,则向后取一个字符,重复开始判断,当取得一个循环节并且后面重复时,记录其总长度,向后开继续判断,如找到更长的,则输出最长的,否则,把第一个结果输出。

6.对序列1、1、2、3、5、8、13。。。。是Fab..数列,2、3、5、13...是Fab..质数数列,因为他们与自己前面的Fab...数列都互质,给出k,返回比k小的Fab..质数

#include

#include

#include

using namespace std;

void findFib(int k)

{

vector fib1;

vector fib2;

fib1.push_back(1);

fib1.push_back(1);

fib1.push_back(2);

fib2.push_back(2);

bool found = false;

int len = fib1.size();

int f = 0;

while (fib1[len - 1] < k)

{

f = fib1[len - 2] + fib1[len - 1];

fib1.push_back(f);

len ++;

}

for (int i = 2;i < fib1.size()-1;i++) {

found = true;

for (int j = 0; j< fib2.size();j++)

{

if (fib1[i] % fib2[j] == 0)

{

found = false;

break;

}//end if

}//end for 2

if (found)

{

fib2.push_back(fib1[i]);

}

}//end for 1

for (i = 0;i < fib2.size();i++)

{

printf("%d ",fib2[i]);

}

printf("\n");

}

void main()

{

int k;

printf("input k\n");

scanf("%d",&k);

while (k >2)

{

findFib(k);

printf("input k\n");

scanf("%d",&k);

}

}

7.101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。硬币分成三堆,俩堆50个,和另外一个1,称俩堆50个,如果重量相等。

则说明假币是那单独的一个,随便取一个真币和这个假币做比较,即可得出哪个硬币更重

如果重量不相等,说明剩下那个硬币是真的,然后俩堆50个里面有一个必然是假的,同时天平不平衡。用一个真币跟这俩堆比较显然得不出结果。

一堆,分成俩份25个,称一次,如果重量相等,那么假币在另外一堆,否则假币在原先的50个一堆里,然后再结合先前一次称的时候俩堆50个币的轻重大小即可得知是假币重还是真币重

8.完成字符串拷贝可以使用sprintf、strcpy 及memcpy 函数,请问这些函数有什么区别

,你喜欢使用哪个,为什么?

答案:这些函数的区别在于实现功能以及操作对象不同。

1.strcpy 函数操作的对象是字符串,完成从源字符串到目的字符串的拷贝功能。

2.sprintf 函数操作的对象不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现(字符串或基本数据类型)向字符串的转换功能。如果源对象是字符串,并且指定%s 格式符,也可实现字符串拷贝功能。

3.memcpy 函数顾名思义就是内存拷贝,实现将一个内存块的内容复制到另一个内存块这一功能。内存块由其首地址以及长度确定。程序中出现的实体对象,不论是什么类型,其最终表现就是在内存中占据一席之地(一个内存区间或块)。因此,memcpy 的操作对象不局限于某一类数据类型,或者说可适用于任意数据类型,只要能给出对象的起始地址和内存长度信息、并且对象具有可操作性即可。鉴于memcpy 函数等长拷贝的特点以及数据类型代表的物理意义,memcpy 函数通常限于同种类型数据或对象之间的拷贝,其中当然也包括字符串拷贝以及基本数据类型的拷贝。

对于字符串拷贝来说,用上述三个函数都可以实现,但是其实现的效率和使用的方便程度不同:

?strcpy 无疑是最合适的选择:效率高且调用方便。

?snprintf 要额外指定格式符并且进行格式转化,麻烦且效率不高。

?memcpy 虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;并且如果长度指定过大的话(最优长度是源字符串长度+ 1),还会带来性能的下降。其实strcpy 函数一般是在内部调用memcpy 函数或者用汇编直接实现的,以达到高效的目的。因此,使用memcpy 和strcpy 拷贝字符串在性能上应该没有什么大的差别。

对于非字符串类型的数据的复制来说,strcpy 和snprintf 一般就无能为力了,可是对memcpy 却没有什么影响。但是,对于基本数据类型来说,尽管可以用memcpy 进行拷贝,由于有赋值运算符可以方便且高效地进行同种或兼容类型的数据之间的拷贝,所以这种情况下memcpy 几乎不被使用。memcpy 的长处是用来实现(通常是内部实现居多)对结构或者数组的拷贝,其目的是或者高效,或者使用方便,甚或两者兼有。

9.变量的声明和定义有什么区别?

声明是向编译器介绍名字--标识符。它告诉编译器“这个函数或变量在某处可找到,它的模样象什么”。而定义是说:“在这里建立变量”或“在这里建立函数”。它为名字分配存储空间。无论定义的是函数还是变量,编译器都要为它们在定义点分配存储空间。对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存其数据,对于函数,编译器会生成代码,这些代码最终也要占用一定的内存。

在C和C++中,可以在不同的地方声明相同的变量和函数,但只能有一个定义(有时这称为ODR,单一定义规则)。。。

定义也可以是声明,如果有int x;,之前编译器未发现标识符x,编译器则把这一标识符看成是定义并立即为它分配存储空间。

。。。。。

对“变量声明”的解释向来模糊且自相矛盾。。。

函数声明包括函数类型、函数名、参数列表和一个分号,这些信息足以编译器认出它是一个函数声明并可识别出这个函数的外部特征。由此推断,变量声明应是类型标识后面跟一个标识符。如int a;但这产生了一个矛盾,这段代码有足够的信息让编译器为之分配存储空间,而且编译器也确实给之分配了存储空间。要解决这个问题,对于C和C++需要一个关键字来说明“这是一个声明,它的定义在别的地方”,这个关键字就是extern,它表示变量是在文件以外定义的,或在文件后面定义的。

在变量定义前加extern表示声明一个变量但不定义它,如:

extern int a;

extern也可用于函数声明,如:

extern int func1(int length,int width);

但由于没有函数体,编译器必把它当成声明而非定义,extern对于函数来说是多余的、可选的。C语言的设计者并不要求函数声明使用extern,这可能有些令人遗憾,如果函数声明也要求用extern,那么形式上与变量声明更加一致了,从而减少了混乱(但这就需要更多的输入,这也许能解释为什么不要求函数声明使用extern的原因)。。。

10.请写出下面代码在32 位平台上的运行结果,并说明sizeof 的性质:

#include

#include

int main(void)

{

char a[30];

char *b = (char *)malloc(20 * sizeof(char));

printf("%d\n", sizeof(a)); //30

printf("%d\n", sizeof(b)); //4

printf("%d\n", sizeof(a[3])); //1

printf("%d\n", sizeof(b+3)); //4

printf("%d\n", sizeof(*(b+4))); //1

return 0 ;

} sizeof就是要求一种数据(类型)所占内存的字节数. 对于4.1中的s和p

sizeof(s)应为6, 而sizeof(p)应为一个"指针"的大小.

12.请完成以下题目。注意,请勿直接调用ANSI C 函数库中的函数实现。

a)请编写一个C 函数,该函数给出一个字节中被置1 的位的个数,并请给出该题的至少一个不同解法。第一种unsigned int TestAsOne0(char log)

{

int i;

unsigned int num=0, val;

for(i=0; i<8; i++)

{

val = log >> i; //移位

val &= 0x01; //与1相与

if(val)

num++;

}

return num;

}

第二种unsigned int TestAsOne1(char log)

{

int i;

unsigned int num=0, val;

while(log)

{

log &= (log -1);

num++;

}

return num;

}

b)请编写一个 C 函数,该函数将给定的一个字符串转换成整数。

int Invert(char *str)

{

int num=0;

while(*str!='\0')

{

int digital=*str-‘0’;

num=num*10+digital;

str=str+1;

}

return num;

}

c)请编写一个 C 函数,该函数将给定的一个整数转换成字符串。

void IntToCharChange(int num, char* pval)

{

char strval[100];

int i, j;

int val0 = 0;

val0 = num;

for(i=0; i<100; i++)

{

val1 = val0 % 10; //取余

val0 = val0 / 10; //取整

strval[i] = val1 + ‘0’; //数字—字符

if(val0 < 10)

{

i++;

strval[i] = val0 + ‘0’;

break;

}

}

for(j=0; j<=i; j++) //倒置

{

pval[j] = strval[i-j];

}

pval[j] = '\0';

}

d)请编写一个 C 函数,该函数将一个字符串逆序。

void AntitoneValue(char* father, char* child)

{

int i;

char source[100];

int j = 0;

while(father[j]) //放入source,[j]为长度

{

source[j] = father[j];

j++;

if(j > 99)

{

return;

}

}

source[j] = '\0';

for(i=0; i

{

child[i] = source[j-i-1]; //反序

}

child[i] = '\0';

}

e)请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。

int search(char *cpSource, int n, char ch) //起始地址,搜索长度,目标字符

{

int i;

for(i=0; i

return i;

}

f)请编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,该字符串是由同一字符组成的。int ChildString(char*p) //自己写

{

Char *q=p;

int stringlen=0, i=0,j=1,len=0,maxlen=1;

while(*q!=’\0’) //不能用strlen,求得长度stringlen,

//因为题目要求请勿直接调用ANSI C 函数库中的函数实现。

{

Stringlen++;

q++;

}

if(*(p+i)==*(p+j)&&j< Stringlen)

{

len++; //统计子串长度

i++;

j++;

}

else

{

if(len>maxlen) //统计最大子串长度

{

maxlen=len+1;

len=0;

}

else {

len=0;

}

i++;

j++;

}

}

return maxlen;

}

给出演示上述函数功能的一个简单程序,并请编写对应的 Makefile 文件

13.我们需要编写一个图形相关的应用程序,需要处理大量图形(Shape)信息,图形有矩形(Rectangle),正方形(Square),圆形(Circle)等种类,应用需要计算这些图形的面积,并且可能需要在某个设备上进行显示(使用在标准输出上打印信息的方式做为示意)。

a)请用面向对象的方法对以上应用进行设计,编写可能需要的类

b)请给出实现以上应用功能的示例性代码,从某处获取图形信息,并且进行计算和绘制

c)如果你的Square继承自Rectangle,请给出理由,如果不是,请给出理由,并且请比较两种方式的优劣

d)请问你所编写的类,在如下代码中会有何表现,请解释

void test_rectangle_area(Rectangle& r)

{

r.set_width(10);

r.set_height(15);

assert(r.area() == 150);

}

14.假设现有一个单向的链表,但是只知道只有一个指向该节点的指针p,并且假设这个节点不是尾节点,试编程实现删除此节点

参考:将下一个节点的内容复制到本节点上,然后删除下一个节点;

15.写一个程序,把一个100以内的自然数分解因数。(自然数分解因数就是将一个自然数分解为几个素数的乘积,提示,由于该数不是很大,所以可以将质数保存在数组中,以加快计算速度)

/*-------------------------------------------------

分解质因数的算法

2005-03-13

RainFly

-------------------------------------------------*/

#include

#include

#include

int main()

{

int i=2,N;

cout<<"请输入一个整数:";

cin>>N;

bool fcontinue = false;

bool found = false;

int t = (int) sqrt(N);

printf("sqrt(%d) = %d\n",N,t);

for (;i<= sqrt(N);i++)

{

printf("i= %d,sqrt(%d) = %d \n\n",i,N,t);

if(N % i == 0) //i肯定是质数,N肯定不是质数

{

fcontinue = true; //如果找到一个质数,则可以继续分解

printf("发现一个质数,继续分解\n");

found = true; //至少发现一个质数

printf("在本次中,至少发现一个质数\n");

cout<

N=N/i;

printf("N= %d\n",N);

break ;

}

}

if (i > sqrt(N))

{

printf("for loop is finished\n");

}

if(fcontinue)

{

printf("跳过后面的部分,开始下一次分解\n");

fcontinue = false;

continue;

}

if(found)

{

printf("在前面中,发现质数,在此输出\n");

cout<

}

else

cout<

printf("中断循环,结束\n");

break;

}

return 0;

}

16.编写一个Identify的分配、释放的函数,为1-10000之间的自然数。

17.分别实现itoa和atoi.

18.Consider the following code:

#include

#include

int main(int argc, char *argv[]) {

int i = 1;

char buf[4];

strcpy(buf, "AAAA");

printf("%d\n", i);

return 0;

}

a) When compiled and executed on x86, why does this program usually not output what the programmer intended? 在x86上为什么不能得到预期结果

programmer intended can be prevented WITHOUT changing the code.

参考:第一个问题:

32位情况:

x86下,栈方向向上生长.在main的栈中,先分配i空间(4byte),然后分配4个字节的buf(地址在i的上面,比i小).strcpy越界,用0把buf 开始的第4(0开始)个字节覆盖掉了.而x86是LSB排列顺序,所以真好覆盖了i的内个数字1.所以显示出数字0.

16位情况同样分析即可.

第2问?

19.int w=1,x=2,y=3,z=4;

m=(w

m=(m

m=(m<2)?m:z;

printf("m=%d",m); 说出结果

答案:1

20.说出结果???

#include

main()

{

FILE *fp;

int i,a[4]={1,2,3,4},b;

fp=fopen("data.dat","wb");//这里帮忙解释一下

for(i=0;i<4;i++)

fwrite(&a[i],sizeof(int),1,fp);//这里也帮忙看一下

fclose(fp);

fp=fopen("data.dat","rb");

fseek(fp,-2L*sizeof(int),SEEK_END);//还有这里

fread(&b,sizeof(int),1,fp);//这里还有也看一下

fclose(fp);

printf("b=%d\n",b);

}

21.有双向循环链表结点:(华为面试题)

typedef struct node

{

int date;

struct node *front,*next;

}_Node;

有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两上链表中date值相同的结点删除

参考算法:

1.取出A的一个元素d

2.收集B中有相同元素d的结点到垃圾箱,并从B里删除

3.收集A中有相同元素d的结点到垃圾箱,并从A里删除

4.删除垃圾箱中的所有元素

5.A链的指针指向下一个

6.重复1~5,直到A链循环到头了

注意的是第3步,在2步执行后垃圾箱不为空时才执行。

上述算法还可以做一点点优化:

1.加入两个变量cA, cB,分别记录当前A中和B中的元素个数

每次从较长者中取出一个元素来,先从较小者中找起

若没有,则不必在较长者中浪费时间了

#include

struct NODE

{

int date;

NODE *front,*next;

};

void redel(NODE *&ahead,NODE *&bhead)

{

int boy=0;

while(pa->next!=ahead)

{

int boys=pa->date; //取pa中一个值

paaaa=pa;

paa=pa;

pb=bhead;

while(pb->next!=bhead)

{

if(boys==pb->date) //如果pa,pb中有值相同

{

cout<

cout<<"delete B:"<date<<" ";

if(pb==bhead)

{

boy=1;

pb->front->next=pb->next;

pb->next->front=pb->front;

bhead=bhead->next;

pbb=pb;

pb=pb->next;

delete pbb;

}

else

{

boy=1;

pb->front->next=pb->next;

pb->next->front=pb->front;

pbb=pb;

pb=pb->next;

delete pbb;

}

}

else

pb=pb->next;

}

while(paa->next!=ahead && boy==1)

{

if(paa->date==boys)

{

cout<<"delete A:"<date<<" ";

if(paa==pa)

{

pa=pa->next;

ahead=pa;

paa->front->next=paa->next;

paa->next->front=paa->front;

paaa=paa;

paa=paa->next;

delete paaa;

}

else

{

paa->front->next=paa->next;

paa->next->front=paa->front;

paaa=paa;

paa=paa->next;

delete paaa;

}

}

else

{

}

}

boy=0;

if(paaaa==pa)

pa=pa->next;

}

cout<

}

int main()

{

NODE *A,*pHeadA,*B,*pHeadB;

A=new NODE;

B=new NODE;

pHeadA=A;

pHeadB=B;

for(int i=1;i<21;++i) //生成链表A,并赋初值!

{

A->date=i;

A->next=new NODE;

A->next->front=A;

A=A->next;

}

A=A->front;

delete A->next;

A->next=pHeadA;

pHeadA->front=A;

for(int i=1;i<33;i+=2) //生成链表B,并赋初值!

{

B->date=i;

B->next=new NODE;

B->next->front=B;

B=B->next;

}

B=B->front;

delete B->next;

B->next=pHeadB;

pHeadB->front=B;

redel(pHeadA,pHeadB); //调用函数删除相同结点!

}

22.

char * GetStr()

{

char *tmp;

tmp = "123"

return tmp;

}

void main()

{

printf("%s", GetStr());

}

会输出123吗?123创建在堆上还是栈上呢?123的空间是什么时候释放的?

参考:"123" 是常量字符串,存储在全局变量区,和静态变量一起。即不在堆,也不在栈在程序结束时自动释放

23.1)字符指针、浮点数指针、以及函数指针这三种类型的变量哪个占用的内存最大?为什么?

答案:指针变量也占用内存单元,而且所有指针变量占用内存单元的数量都是相同的。就是说,不管是指向何种对象的指针变量,它们占用内存的字节数都是一样的,并且要足够把程序中所能用到的最大地址表示出来(通常是一个机器字长)。

2)类ClassB从ClassA派生,那么ClassA *a = new ClassB(…); 试问该表达是否合法?为什

么?

答案:派生类的指针指向基类的对象是错误的,不能通过编译的;基类的指针可以指向派生类的对象,调用派生类的函数鸡是动物,没错。(动物的指针指向鸡的实例)

鸡可以执行所有动物都具有的方法,例如“死亡”

反过来,动物一定是鸡吗?(鸡的指针指向动物或者动物的某个派生类的实例)

动物都能执行鸡的某个方法吗?比如说“下蛋”?

3)如果ClassA中定义并实现虚函数int func(void),ClassB中也实现该函数,那么上述变量a->func()将调用哪个类里面的函数?如果int func(void)不是虚函数,情况又如何?为什么?

答案:第一问调用的是B的。第二问调用A的。

虚函数的一个典型应用,虚函数只能借助于指针或者引用来达到多态的效果

如果没有定义成虚函数:------

class A{

public:

void print(){ cout<<”This is A”<

};

class B:public A{

public:

void print(){ cout<<”This is B”<

};

int main(){ //为了在以后便于区分,我这段main()代码叫做main1

A a;

B b;

A* p1=&a;

A* p2=&b;

p1->print();

p2->print();

}

结果是两个This is A

如果定义成虚函数:---------

class A{

public:

virtual void print(){ cout<<”This is A”<

};

class B:public A{

public:

void print(){ cout<<”This is B”<

};

再运行main输出的结果就是This is A和This is B

测试:

4)char **p, a[16][8]; 问:p=a是否会导致程序在以后出现问题?为什么?

参考:这个不会导致出现问题,但是要注意p的使用,如a[1][2] 等价的为*(*(p+1)+2)而不是*(p+11),

会的,这样会出现编译错误正确的是:char a[5][5]; char (*p)[5]; p=a;

如下所述的if else和switch语句哪个的效率高?为什么?

5)在同一个进程中,一个模块是否可以通过指针操作破坏其它模块的内存,为什么?(华为)

6)应用程序在运行时的内存包括代码区和数据区,其中数据区又包括哪些部分?

参考:对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。

24.Assignment 2: Picture Processing

Use C++, Java, or similar languages or/and any middleware such as EJB and J2EE to process a picture with a high resolution (3 Mega Pixels for example). Use some methodologies to degrade the resolution of the picture to make it quicker for browsing. Then divide the degraded picture into 9 sectors equally. Click any of the 9 sectors will result a detailed picture for this sector with the same resolution as that of the original picture. This assignment is designed for you to demonstrate your ability to handle pictures.

25.用<<,>>,|,&实现一个WORD(2个字节)的高低位交换!!

int main()

{

unsigned short a = 0xABCD;

unsigned short b ;

unsigned short c ,d;

b = (a << 8)&0xff00;

c = (a >> 8)&0x00ff;

d = b | c;

printf("\n%x",b);

printf("\n%x",c);

printf("\n%x",d);

return 0;

}

结果是 CDAB

2俩个字节是16位前八位为高位后八位为低位然后结合

26.要开辟P1,P2,P3,P4内存来做缓冲,大小自定,但这四个缓冲的大小要一样,并且是连续的

27.有一浮点型数组A,用C语言写一函数实现对浮点数组A进行降序排序,并输出结果,要求要以数组A作为函数的入口.(建议用冒泡排序法)

void BubbleSort(double arr[], int n)

{ int i,j;

int exchange = 1;//交换标志

for(i=1;i

exchange=0;//本趟排序开始前,交换标志应为假

for(j=n-1;j>=i;j--) //对当前无序区R[i..n]自下向上扫描

if(arr[j+1] > arr[j]){//交换记录

arr[0]=arr[j+1];//R[0]不是哨兵,仅做暂存单元

arr[j+1]=arr[j];

arr[j]=arr[0];

exchange=1;//发生了交换,故将交换标志置为真

}

if(!exchange) //本趟排序未发生交换,提前终止算法

return;

} //endfor(外循环)

}

28.找错:

#include

#include

class Base

{ private:

char * name;

public:

Base(char * className)

{

name = new char[strlen(className)];

strcpy(name, className);

}

~Base()

{delete name;}

char * copyName()

{

char newname [256];

strcpy(newname, name);

return newname;

char * getName()

{return name;}

static void print(Base base)

{printf("name: %s\n" , https://www.wendangku.net/doc/426312608.html,);}

};

class Subclass : public Base

{

public:

Subclass(char * className) : Base(className)

{ }

};

int main()

{

Base * pBase = new Subclass("test");

Base::print(*pBase);

printf("name: %s\n", pBase->getName());

printf("new name: %s\n", pBase->copyName());

return 0;

}

29.编写一个函数,函数接收一个字符串,是由十六进制数组成的一组字符串,函数的功能是把接到的这组字符串转换成十进制数字.并将十进制数字返回.

答案:

BOOL HexToDec( LPCTSTR shex,int& idec )

{

int i,mid;

int len = lstrlen( shex );

if( len>8 )

return FALSE;

mid = 0; idec = 0;

for( i=0;i

{

if( shex[i]>='0'&&shex[i]<='9' )

mid = shex[i]-'0';

else if( shex[i]>='a'&&shex[i]<='f' )

mid = shex[i] -'a' +10;

else if( shex[i]>='A'&&shex[i]<='F' )

mid = shex[i] -'A' +10;

else

return FALSE;

mid <<= ((len-i-1)<<2); // 移位表示变为2的n次方倍

idec =idc+mid;

}

return TRUE;

}

30.编写一个函数将一条字符串分成两部分,将前半部分按ASCII码升序排序,后半部分不变,(如果字符串是奇数则中间的字符不变,)最后再将前后两部分交换,然后将该字符串输出,

测试字符串“ADZDDJKJFIEJHGI”

31.找错

Void test1()

{ char string[10];

char* str1="0123456789";

strcpy(string, str1);

}

Void test2()

{ char string[10], str1[10];

{str1[i] ='a';}

strcpy(string, str1);

}

Void test3(char* str1)

{ char string[10];

if(strlen(str1)<=10)

{ strcpy(string, str1);}

}

32. 找错

#define MAX_SRM 256

DSN get_SRM_no()

{ static int SRM_no;

int I;

for(I=0;I

{

if(MY_SRM.state==IDLE)

{

break;

}

}

if(I>=MAX_SRM)

return (NULL_SRM);

else

return SRM_no;

}

简单的阅读一下这个函数,可以大概的可以猜测出这个函数的功能是分配一个空闲的SRAM块。方法:从上次分配的RAM块后的RAM块开始检测SRAM每个RAM块,看是否是IDLE状态,如果是IDLE则返回当前的RAM块的号SRM_no。如果所有的RAM块都不是IDLE状态,则意味着无法分配一个RAM给函数调用者,返回一个表示没有RAM可分配的标志(NULL_SRM)。

经过上面的分析,则这里可以知道,这个函数的错误是for循环里面没有给SRM_no这个变量累加1。

33. 写出程序运行结果

int sum(int a)

{ auto int c=0;

static int b=3;

c+=1;

b+=2;

return(a+b+C);

}

void main()

{ int I;

int a=2;

for(I=0;I<5;I++)

{ printf("%d,", sum(a));}

}

34. int func(int a)

{int b;

switch(a)

{ case 1: b = 30;

case 2: b = 20;

case 3: b = 16;

default: b = 0;

}

return b;

}

则func(1)= 0

int a[3];

a[0]=0; a[1]=1; a[2]=2;

int *p, *q;

p=a;

q=&a[2];

则a[q-p]=?

36.

定义 int **a[3][4], 则变量占有的内存空间为:___48__

37.

编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004年12

月31日23时59分59秒,则输出2005年1月1日0时0分0秒。

38.写一个函数,判断一个int型的整数是否是2的幂,即是否可以表示成2^X的形式(不可以用循环)我只知道是用递推,大概写了一下,如下:

int IsTwoPow(int s)

{ if(s==1)return FALSE;

s=s>>1;

if(s>1)IsTwoPow(s);

return (s==1)?TRUE:FALSE;//大概是这个意思,但是这一句似乎不该这么返回!

}

39 A,B从一堆玻璃球(共100个)里向外拿球,规则如下:

(1)A先拿,然后一人一次交替着拿;

(2)每次只能拿1个或2个或4个;

(3)谁拿最后一个球,谁就是最后的失败者;

问A,B谁将是失败者?写出你的判断步骤。

40.已知:无序数组,折半查找,各元素值唯一。函数原型是:Binary_Seach(int array[], int iValue, int iCount)array是数组,在里面用折半查找的方法找等于iValue的值,找到返回1否则0,iCount是元素个数

41.统计一个字符串中字符出现的次数

42.100位以上的超大整数的加法(主要考虑数据结构和加法的实现)

43.对如下电文:"CASTCASTSATATATASA"给出Huffman编码。

44.int (* (*f)(int, int))(int)表示什么含义?

a function pointer

it points to a function that takes two arguments and return another function pointer that is

"int (*)(int)"

45.x=x+1,x+=1,x++,为这三个语句的效率排序。并说明为什么。

46.中缀表达式 A-(B+C/D)*E的后缀形式是什么?

47.struct S1

{ char c;

int i;

};

sizeof(S1) = ?

class X{

public:

X();

virtual ~X();

void myMemberFunc();

static void myStaticFunc();

virtual void myVirtualFunc();

private:

int i;

char * pstr;

char a;

}

sizeof(X) = ?

48.找出两个字符串中最大子字符串,如"abractyeyt","dgdsaeactyey"的最大子串为"actyet"

{

char *p1, *p2, *q1, *q2, *destp;

char *substr;

int max = 0, len;

p1 = str1;

while (*p1 != '')

{

q1 = str2;

while (*q1 != '')

{

len = 0;

p2 = p1; q2 = q1;

while ((*p2 != '') && (*q2 != '')) {

if (*p2 == *q2)

{

p2++; q2++; len++;

}

else

break;

} if (len > max)

{

max = len; destp = p1;

}

q1++;

}

p1++;

}

substr = (char *)malloc(sizeof(char)*max); strncpy(substr,destp,max);

return substr;

}

int main(){

char *s1 = "asdfghjkl";

char *s2 = "asdwfghjews";

char *sub;

printf(" %s %s", s1, s2);

sub = maxsubstr(s1, s2);

printf(" the max sub string is: %s", sub); return 0;}

49.有一百个整数,其中有负数,找出连续三个数之和最大的部分.

void hundurd(int a[],int n)

{

long result = 0;

int temp1 = a[0] + a[1] + a[2];

int temp2;

result = temp1;

for (int i = 2;i < n;i ++)

{

temp2 = temp2 - a[i - 2] + a [i + 1];

if (temp2 > temp1)

{

result = temp2;

}

temp1 = temp2;

}

return result;

}

50.写一程序实现快速排序. 假设数据输入为一文件

快速算法描述如下

Algorithm Partition

Input: sequence a0, ..., an-1 with n elements

Output: permutation of the sequence such that all elements a0, ..., aj are les s than or equal to all

elements ai, ..., an-1 (i > j)

Method:

choose the element in the middle of the sequence as comparison element x

let i = 0 and j = n-1

while ij

search the first element ai which is greater than or equal to x

search the last element aj which is less than or equal to x

if ij

exchange ai and aj

After partitioning the sequence, Quicksort treats the two parts recursively by

the same procedure.

The recursion ends whenever a part consists of one element only.

51.写一算法检测单向链表中是否存在环(whether there is a loop in a link list),

要求算法复杂度(Algorithm's complexity是O(n)) 并只使用常数空间(space is O(c)).

注意,你只知道一个指向单向链表头的指针。链表的长度是不定的,而且环出现的地方也是不定的,环有可能在头,有可能在中间。而且要求是检测, 不能破坏环的结构.(MOTO)

答:用两个指针来遍历这个单向链表,第一个指针p1,每次走一步;第二个指针p2,每次走两步;当p2 指针追上p1的时候,就表明链表当中有环路了。

int testLinkRing(Link *head)

{

Link *t1=head,*t2=head;

while( t1->next && t2->next)

{

t1 = t1->;next;

if (NULL == (t2 = t2->next->next))

return 0; //无环

if (t1 == t2)

return 1;

}

return 0;

}

如果要定位环路在链表当中的开始点

发现p2和p1重合,确定了单向链表有环路了。接下来,让p2回到链表的头部,重新走,P1也继续走,每次步长都走1,那么当p1和p2再次相遇的时候,就是环路的入口了。

52.设下列函数已经通过了调试

bool Sort_Array(ArrayType * Pinputarray, ArrayType * Poutarray);

该函数在内存中排序,能把字节数最大为100M字节的ArrayType类型的数组排序。其中ArrayType是一个预定义的数组类型(细节无关紧要),Pinputarray,Poutarray分别为排序前的指针和排序后的指针。

请用c语言的伪码风格设计一个算法,他调用上面给出的函数完成下列从输入到输出的任务:

输入:排序前的大文件,名称为char * pinoutfilename ,其内容为用分号分隔的ArrayType类型的数组元素,可装满4个100M字节的数组。

输出:排序后的大文件char * poutoutfilename。

53.用最有效率的方法算出2乘以8等於几?

移位

54.选择题

1.错误的转义字符是 (a )

A.'\091'

B.'\\'

C.'\0'

D.'\''

String s="\""; //s=" char c='\''; //c=' \是转移字符

2.若数组名作实参而指针变量作形参,函数调用实参传给形参的是 (d )

A.数组的长度

B.数组第一个元素的值

C.数组所有元素的值

D.数组第一个元素的地址

3.变量的指针含意是指变量的 (b )

A.值

B.地址

C.存储

D.名字

5.某文件中定义的静态全局变量(或称静态外部变量)其作用域是 (d )??

A.只限某个函数

B.本文件

C.跨文件

D.不限制作用域

静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

55.

1. 解二次方程:a*x*x+b*x+c

int Quadratic( double a,double b,double c,double& x1,double& x2);

返回值:解的个数用求根公式计算

2. 最大公约数

DWORD Divisor( DWORD dwFirst, DWORD dwSecond );

long Divisor( long dwFirst, long dwSecond )

{

if (dwFirst < dwSecond)

{

long temp = dwFirst;

dwFirst = dwSecond;

dwSecond = temp;

}

if (dwSecond == 0)

{

return dwFirst;

}

if (dwFirst % 2 == 0)

{

if (dwSecond % 2 == 0)

{

return(Divisor(dwFirst >> 1,dwSecond >> 1) << 1);

}

else

{

return Divisor(dwFirst >> 1,dwSecond);

}

}

else

{

if (dwSecond % 2 == 0)

{

return Divisor(dwFirst,dwSecond >> 1);

}

else

{

return Divisor(dwSecond,dwFirst - dwSecond);

}

}

}

3. 根据蒙特卡洛算法计算圆周率

double PI( DOWRD dwCount/*测试次数*/ );

返回值:PI

/**//*

利用蒙特卡洛算法近似求圆周率PI

VC++6.0

ZZH

*/

#include

#include

#include

#define COUNT 500000 //循环取样次数

using namespace std;

bool InCircle(double x,double y)//是否在1/4圆范围之内

{

if((x*x+y*y)<=1)return true;

return false;

}

void main()

double x,y;

int num=0;

int i;

srand((unsigned)time(NULL));

for(i=0;i

{

x=rand()*1.0/RAND_MAX;

y=rand()*1.0/RAND_MAX;

if(InCircle(x,y)) num++;

}

cout<<"PI:"<<(num*4.0)/COUNT<

}

结果:测试5次的结果显示:3.13958,3.14041,3.13729,3.13859,3.14186

4. 无符号整数乘法,乘数为32bit,结果为64bit

提示:32bit整数分解为16bit相乘

void Multiply( DWORD dwFirst, DWORD dwSecond, DWORD& dwHigh, DWORD& dwLower );

5. 链表排序(从小到大)

节点定义为:

struct Node{

int nValue;

struct Node* pNext;

};

最后一个节点的pNext = NULL.

Node* SortChain( Node* pHead );

返回值:链表头

冒泡排序,插入排序等。为避免繁琐可以不交换指针,只交换值;也可以将值存入数组,对数组排序,再存入链表中。

改错并说明原因

file: 1.c

int a[10]={0};

file: 2.c

int main ()

{ extern int *a;

printf ("%d\n", a[0]);

return 0;

}

1 #include “filename.h”和#include 的区别?

对于#include 编译器从标准库开始搜索filename.h;对于#i nclude “filename.h”编译器从用户工作路径开始搜索filename.h

2 头文件的作用是什么?

一、通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。

二、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。

3 C++函数中值的传递方式有哪几种?

C++函数的三种传递方式为:值传递、指针传递和引用传递。

4 内存的分配方式的分配方式有几种?

答:一、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。

二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

三、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负

5 实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;

//删除操作

Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e)

{

if(!(p=GetElemP_DuL(L,i))) //此处得到i位置的节点指针,如果有需要也得写出具体函数实现

return ERROR;

e=p->data;

p->prior->next=p->next;

p->next->prior=p->pror;

free(p);

return OK;

}

//插入操作

Status ListInsert_DuL(DuLinkList &L,int i,ElemType &e)

{

if(!(p=GetElemP_DuL(L,i)))

return ERROR;

if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) //生成新节点

return ERROR;

s->data=e;

s->prior=p;

p-> next -> prior =s;

p->next=s;

s->next=p->next->next;

return OK;

}

6 写一个函数,将其中的\t都转换成4个空格。

include

#include

using namespace std;

int main()

{

string s="dasfas\tfdasfsdaf\tdfsdfa";

int c=0;

while((c=s.find("\t",c+1))!=string::npos)

{

s.replace(c,1," ");

}

cout<

return 0;

}

7 Windows程序的入口是哪里?写出Windows消息机制的流程.

A:

入口点是WinMain函数.

Windows消息机制的流程:

1.Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能创建的各种窗口的消息。应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。

2.Windows为当前执行的每个Windows程序维护一个「消息队列」。在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中。程序通过执行一块称之为「消息循环」的程序代码从消息队列中取出消息:

while(GetMessage (&msg, NULL, 0, 0))

{

TranslateMessage (&msg) ;

嵌入式C语言经典笔试题目

嵌入式c语言经典笔试题目 1 .用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1) #define语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。 3)意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。 4)如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。 2 .写一个"标准"宏MIN,这个宏输入两个参数并返回较小的一个。 #define MIN(A,B)((A)<= (B) ? (A) : (B)) 这个测试是为下面的目的而设的: 1)标识#define在宏中应用的基本知识。这是很重要的。因为在嵌入(inline)操作符变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。 2)三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。 3)懂得在宏中小心地把参数用括号括起来 4)我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事? least = MIN(*p++, b); 3.预处理器标识#error的目的是什么? 如果你不知道答案,请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。 死循环(Infinite loops) 4.嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢? 这个问题用几个解决方案。我首选的方案是: while(1) { } 一些程序员更喜欢如下方案: for(;;) { } 这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,

c语言笔试题(答案)(精心整理)

笔试题 一、填空题(每个空4分,共28分) 1)struct tagABC { char name[10]; char sex; long sno; float score[4]; }*pAbc;(四字节对齐) pAbc=NULL; 那么,执行pAbc+=2;之后pAbc的值为(64 ) 2)如下代码,最终value的值是(8) int *p1,*p2; int value; p1=(int*)0×400; p2=(int*)0×408; value = p2-p1; 3)如下代码,printf的结果为(2) #include〈stdio.h〉 #include〈string.h〉 void main(void) { char acNew[20]= “\\0\0”; printf(“%d\n”,strlen(acNew)); } 4) 有如下程序段,运行该程序的输出结果是(33) main () { int y=3,x=3,z=1; printf(“%d%d\n”,(++x,y++),z+2); } 5)设有:int a=1,b=2,c=3,d=4,m=2,n=2;执行(m=a>b)&&(n=c>d)后,n的值为(2)6)struct tagAAA { Unsigned char ucId:1; Unsigned char ucPara0:2; Unsigned char ucState:6; Unsigned char ucTail:4; Unsigned char ucAvail; Unsigned char unTail2:4; Unsigned long ulData; }AAA_S 问:AAA_S在字节对齐分别为1,4情况下,占用的空间大小分别是多少?( 9)(12 )

c语言笔试题目及答案

c语言笔试题目及答案 C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。下面是c语言笔试题目及答案,请参考。 c语言笔试题目及答案 一、选择题((1)~(10)每小题2分,(11)~(50)每小题1分,共60分) 下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选 项涂写在答题卡相应位置上,答在试卷上不得分。 (1)数据的存储结构是指________。 A)存储在外存中的数据 B)数据所占的存储空间量 C)数据在计算机中的顺序存储方式 D)数据的逻辑结构在计算机中的表示 答案:D 评析:数据的逻辑结构在计算机存储空间中的存放形式形式称为数据的存储结构(也称数据的物理结构)。 (2)下列关于栈的描述中错误的是________。 A)栈是先进后出的线性表

B)栈只能顺序存储 C)栈具有记忆作用 D)对栈的插入与删除操作中,不需要改变栈底指针 答案:B 评析:栈是一种特殊的线性表,又称先进后出表(FILO—First In Last Out)。 (3)对于长度为n的线性表,在最坏情况下,下列各排序法所对应的比较次数中正确的是 ________。 A)冒泡排序为n2 B)冒泡排序为n C)快速排序为n D)快速排序为n(n一1)/2 答案:D 评析:假设线性表的长度为n,则在最坏情况下,冒泡排序需要经过n/2遍的从前往后扫描和n/2遍的从后往前扫描,需要比较次数为n(n-1)/2。快速排序法的最坏情况比较次数也是n(n-1)/2。 (4)对长度为n的线性表进行顺序查找,在最坏情况下所需要的比较次数为________。 A)log2n B)n/2 C)n D)n+l 答案:C 评析:顺序查找过程中,如果被查找的元素是线性表中的最后一个元素,或者元素不在线性表中,则需要与线性表中所有的元素进行比较。对长度为n的线性表进行顺序查找,在最坏情况下需要比较

嵌入式C语言面试题汇总(超经典)

第一部分:基本概念及其它问答题 1、关键字static的作用是什么? 这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。 大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。 2、“引用”与指针的区别是什么? 答、1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。 指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。 流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。 3、.h头文件中的ifndef/define/endif 的作用? 答:防止该头文件被重复引用。 4、#include 与#include “file.h”的区别? 答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。 5、描述实时系统的基本特性 答:在特定时间内完成特定的任务,实时性与可靠性。 6、全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 答:全局变量储存在静态数据区,局部变量在堆栈中。 7、什么是平衡二叉树? 答:左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。 8、堆栈溢出一般是由什么原因导致的? 答:1.没有回收垃圾资源 2.层次太深的递归调用

c语言经典面试题

C语言面试题大汇总之华为面试题 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 2、如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。 3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错. 4、请写出下列代码的输出内容 #include int main(void) { int a,b,c,d; a=10;

c=++a; d=10*a++; printf("b,c,d:%d,%d,%d",b,c,d); return 0; } 答:10,12,120 5、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 答: 1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 2) 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。3) static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对

C语言面试题(经典全)

1.static有什么用途?(请至少说明两种) 1)限制变量的作用域 2)设置变量的存储域(堆,主动分配内存也是堆) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。 4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在栈 6.堆栈溢出一般是由什么原因导致的? 堆栈溢出一般是循环的递归调用导致的,如果使用的大数据结构的局部变量,也可能导致堆栈溢出。没有回收垃圾资源导致的是内存泄露最后内存耗尽。 20.不能做switch()的参数类型是: switch的参数不能为实型。(只能是int char) 9.写出float x 与“零值”比较的if语句。 if(x<0.000001&&x>-0.000001)

3.在c语言库函数中将一个字符转换成整型的函数是atol()吗,这个函数的原型是什么? 函数名: atol 功能: 把字符串转换成长整型数 函数的原型: long atol(const char *nptr); 程序例: #include #include int main(void) { long l; char *str = "98765432"; l = atol(lstr); printf("string = %s integer = %ld\n", str, l); return(0); } 1.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现? c用宏定义,c++用inline

C语言经典面试题目集锦

1.前言 2.声明和初始化 2.1我如何决定使用那种整数类型? 2.264位机上的64位类型是什么样的? 2.3怎样定义和声明全局变量和函数最好? 2.4extern在函数声明中是什么意思? 2.5关键字auto到底有什么用途? 2.6我似乎不能成功定义一个链表。我试过typedef struct{char*item;NODEPTR next;}*NODEPTR;但是编译器报了错误信息。难道在C语言中一个结构不能包含指向自己的指针吗? 2.7怎样建立和理解非常复杂的声明?例如定义一个包含N个指向返回指向字符的指针的函数的指针的数组? 2.8函数只定义了一次,调用了一次,但编译器提示非法重定义了。 2.9main()的正确定义是什么?void main()正确吗? 2.10对于没有初始化的变量的初始值可以作怎样的假定?如果一个全局变量初始值为``零",它可否作为空指针或浮点零? 2.11代码int f(){char a[]="Hello,world!";}不能编译。 2.12这样的初始化有什么问题?char*p=malloc(10);编译器提示``非法初始式"云云。 2.13以下的初始化有什么区别?char a[]="string literal";char*p="string literal";当我向p[i]赋值的时候,我的程序崩溃了。 2.14我总算弄清除函数指针的声明方法了,但怎样才能初始化呢? 3.结构、联合和枚举 3.1声明struct x1{...};和typedef struct{...}x2;有什么不同? 3.2为什么struct x{...};x thestruct;不对? 3.3一个结构可以包含指向自己的指针吗? 3.4在C语言中实现抽象数据类型什么方法最好? 3.5在C中是否有模拟继承等面向对象程序设计特性的好方法? 3.6我遇到这样声明结构的代码:struct name{int namelen;char namestr[1];};然后又使用一些内存分配技巧使namestr数组用起来好像有多个元素。这样合法和可移植吗? 3.7是否有自动比较结构的方法? 3.8如何向接受结构参数的函数传入常数值? 3.9怎样从/向数据文件读/写结构? 3.10我的编译器在结构中留下了空洞,这导致空间浪费而且无法与外部数据文件进行"二进制"读写。能否关掉填充,或者控制结构域的对齐方式? 3.11为什么sizeof返回的值大于结构的期望值,是不是尾部有填充? 3.12如何确定域在结构中的字节偏移? 3.13怎样在运行时用名字访问结构中的域? 3.14程序运行正确,但退出时却``core dump''了,怎么回事? 3.15可以初始化一个联合吗?

C语言笔试题大全

C语言笔试题大全 4. static有什么用途?(请至少说明两种) 1.限制变量的作用域 2.设置变量的存储域 7. 引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 2) 不存在指向空值的引用,但是存在指向空值的指针。 8. 描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与可靠性 9. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在堆栈 10. 什么是平衡二叉树? 左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1 11. 堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源 12. 什么函数不能声明为虚函数? constructor 13. 冒泡排序算法的时间复杂度是什么? O(n^2) 14. 写出float x 与“零值”比较的if语句。 if(x>0.000001&&x<-0.000001) 16. Internet采用哪种网络协议?该协议的主要层次结构? tcp/ip 应用层/传输层/网络层/数据链路层/物理层 17. Internet物理地址和IP地址转换采用什么协议? ARP (Address Resolution Protocol)(地址解析協議) 18.IP地址的编码分为哪俩部分? IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。 2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。 循环链表,用取余操作做 3.不能做switch()的参数类型是: switch的参数不能为实型。 華為 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如

嵌入式开发c语言经典笔试题-含答案

void e(int ); main(){ int a; a=3; e(a);}void e(int n){ if(n>0) { e(--n); printf("%d" , n); e(--n); }}这段程序的输出是: A.0 1 2 0 B.0 1 2 1 C.1 2 0 1 D.0 2 1 1 typedef int (*test) ( float * , float*)test tmp; tmp 的类型是【】 A.函数的指针,该函数以两个指向浮点数(float)的指针(pointer)作为参数(arguments) Pointer to function of having two arguments that is pointer to float B.整型 C.函数的指针,该函数以两个指向浮点数(float)的指针(pointer)作为参数(arguments),并且函数的返回值类型是整型Pointer to function having two argument that is pointer to float and return int D.以上都不是 第3 题 main(){ char p; char buf[10] ={ 1,2,3,4,5,6,9,8}; p = (buf+1)[5]; printf("%d" , p);}这段程序的输出是:【】 A.5 B.6 C.9 D.以上都不对 第4 题 Void f(char**);main(){ char * argv[] = { "ab" ,"cd" , "ef" ,"gh", "ij" ,"kl" }; f( argv );}void f( char **p ){ char* t; t= (p+= sizeof(int))[-1]; printf( "%s" , t);}这段程序的输出是:【】 A.ab B.cd C.ef D.gh 第5 题 #includeint ripple ( int , ...);main(){ int num; num = ripple ( 3, 5,7); printf( " %d" , num);}int ripple (int n, ...){ int i , j; int k; va_list p; k= 0; j = 1; va_start( p , n); for (; j

C语言面试题大汇总,个人觉得还是比较全

4. static有什么用途?(请至少说明两种) 1.限制变量的作用域 2.设置变量的存储域 7. 引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 2) 不存在指向空值的引用,但是存在指向空值的指针。 8. 描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与可靠性 9. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在堆栈 10. 什么是平衡二叉树? 左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1 11. 堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源 12. 什么函数不能声明为虚函数? constructor 13. 冒泡排序算法的时间复杂度是什么? O(n^2) 14. 写出float x 与“零值”比较的if语句。 if(x>0.000001&&x<-0.000001) 16. Internet采用哪种网络协议?该协议的主要层次结构? tcp/ip 应用层/传输层/网络层/数据链路层/物理层 17. Internet物理地址和IP地址转换采用什么协议? ARP (Address Resolution Protocol)(地址解析協議) 18.IP地址的编码分为哪俩部分? IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。 2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出 C程序。 循环链表,用取余操作做 3.不能做switch()的参数类型是: switch的参数不能为实型。 華為 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内

100条经典C语言笔试题目(全)

100条经典C语言笔试题目 1、请填写bool,float,指针变量与“零值”比较的if语句。 提示:这里“零值”可以是0,0.0,FALSE 或者“空指针”。例如int变量n与“零值” 比较的if语句为: if ( n == 0 ) if ( n != 0 ) 以此类推。 (1)请写出 bool flag 与“零值”比较的 if 语句: 【标准答案】if ( flag ) if ( !flag ) (2)请写出 float x 与“零值”比较的 if 语句: 【标准答案】 const float EPSINON = 0.00001; if ((x >= - EPSINON) && (x <= EPSINON) 不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成 “>=”或“<=”此类形式。 (3)请写出 char *p 与“零值”比较的 if 语句 【标准答案】 if (p == NULL) if (p != NULL) 2、以下为 Linux下的 32 位 C程序,请计算 sizeof 的值。 char str[] = “Hello” ; char *p = str ; int n = 10; 请计算(1)sizeof (str ) = (2)sizeof ( p ) = (3)sizeof ( n ) = 【标准答案】(1)6、(2)4、(3)4 (4)void Func ( char str[100]) { ……; } 请计算 sizeof( str ) = (5)void *p = malloc( 100 ); 请计算sizeof ( p ) = 【标准答案】(4)4、(5)4 3、 long a=0x801010; a+5=? 【标准答案】0x801010用二进制表示为:“1000 0000 0001 0000 0001 0000”,十 进制的值为8392720,再加上5就是8392725。 4、用变量a给出下面的定义

成都理工大学C语言程序设计笔试

成都理工大学《C语言程序设计》期末考试试卷(A卷)(2011级各专业) 一、单项选择题(本大题共20题,每题2 分,共40分) 1、以下不是C语言的特点的是。 A、C语言简洁、紧凑 B、能够编制出功能复杂的程序 C. C语言可以直接对硬件进行操作 D、C语言移植性好 2、以下不正确的C语言标识符是 A、 ABC B、 abc C、 a_bc D、 ab.c 3、一个C语言程序是由。 A、一个主程序和若干子程序组成 B、函数组成 C、若干过程组成 D、若干子程序组成 4、一个算法应该具有“确定性”等5个特性,对另外4个特性的描述中错误的是 A、有零个或多个输入 B、有零个或多个输出 C.有穷性 D、可行性 5、设变量a是整型,f是实型,i是双精度型,则表达式10+‘a'+i*f值的数据类型为 不确定 D、、 float C、 double A、 int B 。 C语言中,char型数据在内存中的存储形式是 6、在、ASCII码 C、源码 D A、补码 B、反码。的值是7、有如下程序,输入数据:12345M678<cR>后(表示回车), x#include main(){ int x; float y; scanf(=%f,&x,&y); } 345 、 D 45 A、 12345 B、 123 C、。 8、若有以下定义int a,b; float x,则正确的赋值语句是 b++; 、A、 a=1,b=2 B b=int(x); a=b=5 DC、、。9、以下程序的执行结果是 #include { int i=10,j=10; printf(%d,%d\n,++i,j--); } 10,9 D、 9,10 B、 C、 11,9 、A 11,10 65,以下程序的执行结果是。、巳知字母10A的ASCII码是#include main() { char c1='A',c2='Y'; printf(%d,%d\n,c1,c2);

C语言面试题大汇总之华为面试题2

C语言面试题大汇总之华为面试题2

16.谈谈Windows DNA结构的特点和优点。 答:Windows Distributed interNet Application Architecture(Windows分布式应用结构,简称Windows DNA)是微软创建新一代高适应性商业解决方案的框架,它使公司能够充分地挖掘数字神经系统的优点。Windows DNA是第一个将Internet、客户/服务器、和用于计算的PC模型结合并集成在一起的为新一类分布式计算方案而设计的应用软件体系结构 17.网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?答:1)进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。 2)线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。 两者都可以提高程序的并发度,提高程序运行效率和响应时间。 线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。 思科 1. 用宏定义写出swap(x,y) 答#define swap(x, y) x = x + y; y = x - y; x = x - y; 2.数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型: int do_dup(int a[],int N) 答:int do_dup(int a[],int N) //未经调试 { int sun = 0; int sum2; for(int i=0;i>N==1); 4.unsigned int intvert(unsigned int x,int p,int n)实现对x的进行转换,p 为起始转化位,n为需要转换的长度,假设起始点在右边.如x=0b0001 0001,p=4,n=3转换后x=0b0110 0001 答:unsigned int intvert(unsigned int x,int p,int n) //假定p=4,n=3

c语言经典笔试题(非常全)

1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。 #define MIN(A,B) ((A) <= (B) (A) : (B)) 4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢? 这个问题用几个解决方案。我首选的方案是: while(1) { } 一些程序员更喜欢如下方案: for(;;) { } 第三个方案是用goto Loop: ... goto Loop; 5. 用变量a给出下面的定义 a) 一个整型数(An integer) b) 一个指向整型数的指针(A pointer to an integer) c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) d) 一个有10个整型数的数组(An array of 10 integers) e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers) f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers) g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer) h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(An array of ten pointers to functions that take an integer argument and return an integer ) 答案是: a) int a; // An integer b) int *a; // A pointer to an integer c) int **a; // A pointer to a pointer to an integer d) int a[10]; // An array of 10 integers e) int *a[10]; // An array of 10 pointers to integers f) int (*a)[10]; // A pointer to an array of 10 integers g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer 6. 关键字static的作用是什么?

16道经典C语言面试题

16道经典C语言面试题 .用预处理指令声明一个常数,用以表明年中有多少秒 ( * * * ) ) 语法的基本知识(例如:不能以分号结束,括号的使用,等等) ) 预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。 ) 意识到这个表达式将使一个位机的整型数溢出因此要用到长整型符号,告诉编译器这个常 数是的长整型数。 ) 如果你在你的表达式中用到(表示无符号长整型),那么你有了一个好的起点。 . ) 的方法。 ) ) ) . . 应 . ) 一个整型数) 一个有个整型数的数组) 一个有个指针的数组,该指针是指向一个整型数的) 一个指向有个整型数 数组的指针) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数) 一个有个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数 答案是: ) ; ) *; ) **; ) []; ) *[]; ) (*)[]; ) (*)(); ) (*[])(); 人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇文 章时,为了确定语法的正确性,我的确查了一下书。但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。因为在被面试的这段时间里,我确定我知道这个问题的答案。应试者如果 不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为 这次面试做准备,那么他又能为什么出准备呢?

. 关键字的作用是什么? 在语言中,关键字有三个明显的作用: )在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 )在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 )在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。 .关键字是什么含意? 已经在他 么. 如果应试者 ; 是一个常整型数 针 * ; 的)。 ) ) ) . 用保存在寄存器里的备份。下面是变量的几个例子: )并行设备的硬件寄存器(如:状态寄存器) )一个中断服务子程序中会访问到的非自动变量( ) )多线程应用中被几个任务共享的变量回答不出这个问题的人是不会被雇佣的。 我认为这是区分程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、等等打交道,所用这些都要求变量。不懂得内容将会带来灾难。假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得完全的重要性。 )一个参数既可以是还可以是吗?解释为什么。

华为C语言经典面试题

华为C语言经典面试题。每道题都附有详细解答和讲解,很有参考价值的C语言面试题。怎么判断链表中是否有环? bool CircleInList(Link* pHead) { if(pHead = = NULL || pHead->next = = NULL)//无节点或只有一个节点并且无自环return (false); if(pHead->next = = pHead)//自环 return (true); Link *pTemp1 = pHead;//step 1 Link *pTemp = pHead->next;//step 2 while(pTemp != pTemp1 && pTemp != NULL && pTemp->next != NULL) { pTemp1 = pTemp1->next; pTemp = pTemp->next->next; } if(pTemp = = pTemp1) return (true); return (false); } 两个字符串,s,t;把t字符串插入到s字符串中,s字符串有足够的空间存放t字符串void insert(char *s, char *t, int i) {

memcpy(&s[strlen(t)+i],&s[i],strlen(s)-i); memcpy(&s[i],t,strlen(t)); s[strlen(s)+strlen(t)]='\0'; } 1。编写一个C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。 char * search(char *cpSource, char ch) { char *cpTemp=NULL, *cpDest=NULL; int iTemp, iCount=0; while(*cpSource) { if(*cpSource == ch) { iTemp = 0; cpTemp = cpSource; while(*cpSource == ch) ++iTemp, ++cpSource; if(iTemp > iCount) iCount = iTemp, cpDest = cpTemp; if(!*cpSource) break;

C语言基础笔试题(50道)

C语言基础笔试题(50道) 是一门程序编程语言,越来越受到大家的重视。下面是收集整理的C语言基础笔试 题(50道),欢迎学习!更多内容请关注网! 1、C语言程序的基本单位是____ A) 程序行 B) 语句 C) 函数 D) 字符、C、1 2、C语言程序的三种基本结构是____ A、顺序结构,选择结构,循环结构 B、递归结构,循环结构,转移结构 C、嵌套结构,递归结构,顺序结构 D、循环结构,转移结构, 顺序结构、A、1 3、C语言规定,程序中各函数之间 A) 既允许直接递归调用也允许间接递归调用 B) 不允许直接递归调用也不允许间接递归调用 C) 允许直接递归调用不允许间接递归调用 D) 不允许直接递归调用允许间接递归调用、A、1 4、C语言中可处理的文件类型是() A) 文本文件和数据文件 B)文本文件和二进制 文件 C) 数据文件和二进制文件 D)数据代码文件、B、1 5、C语言可执行程序的开始执行点是() A) 程序中第一条可执行语句 B) 程序中第 一个函数 C) 程序中的main函数 D) 包含文件中的第一个函数、C、1 6、C语言提供的合法的数据类型关键字是 A)double B) short C) integer D) char、B、 1 7、C语言中,运算对象必须是整型数的运算符是 A) % B) \ C) %和\ D) * *、A、1 8、C语言中函数返回值的类型是由()决定。 A) return语句中的表达式类型 B) 调 用函数的主调函数类型 C) 调用函数时临时 D) 定义函数时所指定的函数类型、D、1 9、C语言中数组名作为参数传递给函数,作为实在参数的数组名被处理为_____。A、该数组的长度。 B、该数组的元素个数。 C、该数组中各元素的值。 D、该数组的首地址。、D、1 10、C语言中数组下标的下限是________。A、1 B、0 C、视具体情况D、无固定下限、 B、1 11、C语言中提供的合法关键字是____ A、swith B、cher C、case D、default、D、1 12、C语言中文件的存取方式是________。 A、顺序存取 B、随机存取 C、顺序存取、 随机存取均可 D、顺序存取、随机存取均不可、C、1

嵌入式C语言面试题汇总(超经典)

嵌入式C语言面试题汇总(超经典) 第一部分:基本概念及其它问答题1、关键字static的作用是什么? 这个简单的问题很少有人能回答完全。在C语言中,关键字static 有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。 2、“引用”与指针的区别是什么? 答、1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。3) 不存在指向空值的引用,但是存在指向空值的指针。 指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。 流操作符<和> 、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。 3、.h头文件中的ifndef/define/endif 的作用?答:防止该头文件被重复引用。 4、#include 与#include “file.h”的区别? 答:前者是从Standard Library的路径寻找和引用file.h,而后者

华为C语言面试题

华为C语言面试题

华为C语言经典面试题。每道题都附有详细解答和讲解。 怎么判断链表中是否有环? bool CircleInList(Link* pHead) { if(pHead = = NULL || pHead->next = = NULL)//无节点或只有一个节点而且无自环return (false); if(pHead->next = = pHead)//自环 return (true); Link *pTemp1 = pHead;//step 1 Link *pTemp = pHead->next;//step 2 while(pTemp != pTemp1 && pTemp != NULL && pTemp->next != NULL) {

pTemp1 = pTemp1->next; pTemp = pTemp->next->next; } if(pTemp = = pTemp1) return (true); return (false); } 两个字符串,s,t;把t字符串插入到s字符串中,s字符串有足够的空间存放t字符串 void insert(char *s, char *t, int i) { memcpy(&s[strlen(t)+i],&s[i],strlen(s)-i); memcpy(&s[i],t,strlen(t)); s[strlen(s)+strlen(t)]='\0'; }

1。编写一个C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。 char * search(char *cpSource, char ch) { char *cpTemp=NULL, *cpDest=NULL; int iTemp, iCount=0; while(*cpSource) { if(*cpSource == ch) { iTemp = 0; cpTemp = cpSource; while(*cpSource == ch) ++iTemp, ++cpSource;

相关文档