17
试题 1:C 语言面试题一——华为篇
int i=1;
printf("%d\n",(++i)+(++i)+(++i)+(++i)+(++i));
3+3= 6
3+3+4= 10
3+3+4+5= 15
3+3+4+5+6= 21
// (++i)+(++i)
// (++i)+(++i)+(++i)
//(++i)+(++i)+(++i)+(++i)
// (++i)+(++i)+(++i)+(++i)+(++i)
//(++i)+(++i)+(++i)+(++i)+(++i)+(++i)
//(++i)+(++i)+(++i)+(++i)+(++i)+(++i)+(++i)
// ....
1.static 有什么用途?(请至少说明两种)
1)限制变量的作用域
2)设置变量的存储域(堆,主动分配内存也是堆)
3+3+4+5+6+7= 28
3+3+4+5+6+7+8= 36
1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数
访问。它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的
模块的本地范围内使用
补充:一个代码在运行时分为 4 个区:
1)data:全局,静态,常量
2)code:代码
3)堆:new,malloc 分配的内存,需要 delete,free 释放。如果不释放,则只有等程序运行正常结束时,由操作系统
回收,理论上无限大。
4)栈:场景信息(函数的参数,返回值,局部变量,临时变量),VC 的栈区默认是 4M。对大内存的操作,需要
放堆区。如:
Stedent stu[4*1024*1024] 会出问题,应改为:student *stu=new stu[4*1024*1024] 释放:delete[] stu;
2.引用与指针有什么区别?
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。
3.描述实时系统的基本特性
在特定时间内完成特定的任务,实时性与可靠性
1
4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
全局变量储存在静态数据库,局部变量在栈
5.什么是平衡二叉树?
左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于 1
6.堆栈溢出一般是由什么原因导致的?
堆栈溢出一般是循环的递归调用导致的,如果使用的大数据结构的局部变量,也可能导致堆栈溢出。
没有回收垃圾资源导致的是内存泄露最后内存耗尽。
7.什么函数不能声明为虚函数?
构造函数,静态成员函数,非成员函数,部分模板函数。
8(1).冒泡排序算法的时间复杂度是什么?(其它排序算法的时间复杂度)
O(n^2)
8(2)、数组 a[N],存放了 1 至 N-1 个数,其中某个数重复一次。写一个函数,找出被重复的数字.
时间复杂度必须为 o(N)
int do_dup(int a[],int N)
{
int sum = 0;
for(int i = 0;i-0.000001)
10.Internet 采用哪种网络协议?该协议的主要层次结构?
tcp/ip:应用层/传输层/网络层/数据链路层/物理层
OSI 模型:应用层/(会话层/表示层/)传输层/网络层/数据链路层/物理层
11.Internet 物理地址和 IP 地址转换采用什么协议?
ARP (Address Resolution Protocol)(地址解析協議)
2
18.IP 地址的编码分为哪俩部分?
IP 地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络
位哪些是主机位。
19.用户输入 M,N 值,从 1 至 N 开始顺序循环数数,每数到 M 输出该数值,直至全部输出。写出 C 程序。
循环链表,用取余操作做。
#include
#include "stdlib.h"
#define NULL 0
#define TYPE struct stu
#define LEN sizeof (struct stu)
struct stu
{
};
int data;
struct stu *next;
TYPE *line(int n)
{
int sum=1;
struct stu *head,*pf,*pb;
int i;
for(i=0;idata=i+1;
if (i==0)
else
pf=head=pb;
pf->next=pb;
if (i==(n-1))
pb->next=head;
else pb->next=NULL;
pf=pb;
sum++;
3
head=L;
printf("%d\n",pf->data);
pf=pf->next;
for(i=0;pf!=head;i++)
{
printf("%d\n",pf->data);
pf=pf->next;
}
}
main()
{
int M,N,x,i;
struct stu *p,*q;
printf("please scanf M and N (Mnext;
//找到了M前面的1个
}
printf("p.data=%d\n",p->data);
q=p->next;
printf("%d\n",q->data)
p->next = p->next->next;
p=p->next;
free(q) ;
x--;
; //输出 M
//释放M
//从M的下一个又开始数
}
getch();
}
20.不能做 switch()的参数类型是:
switch 的参数不能为实型。(只能是 int char)
4
试题 2:
1.-1,2,7,28,,126 请问 28 和 126 中间那个数是什么?为什么?
第一题的答案应该是 4^3-1=63
规律是 n^3-1(当 n 为偶数 0,2,4)
n^3+1(当 n 为奇数 1,3,5)
答案:63
2.用两个栈实现一个队列的功能?要求给出算法和思路!
设 2 个栈为 A,B, 一开始均为空.
入队列: 入栈 A
出队列:
1 如果栈 B 不为空,直接弹出栈 B 的数据。
2 如果栈 B 为空,则依次弹出栈 A 的数据,放入栈 B 中,再弹出栈 B 的数据。
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);
}
4.对于一个频繁使用的短小函数,在 C 语言中应用什么实现,在 C++中应用什么实现?
c 用宏定义,c++用 inline
8.软件测试都有那些种类?
黑盒:针对系统功能的测试
白合:测试函数功能,各函数接口
9.确定模块的功能和模块的接口是在软件设计的那个队段完成的?
5
概要设计阶段
11.unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
请问 p1+5=? ;
p2+5=? ;
答:p1+5=0x801005
p2+5=0x810014
;
;
二.选择题:
Windows 消息调度机制是:c
A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈;
三.找错题:
1.请问下面程序有什么错误?
int a[60][250][1000],i,j,k;
for(k=0;k<1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[i][j][k]=0;
把循环语句内外换一下
(编译的时候没错,运行的时候出错,但这个数组太大,如果放在栈中,还是会溢出,要作为全局变
量)
2.#define Max_CB 500
void LmiQueryCSmd(Struct MSgCB * pmsg)
{
unsigned char ucCmdNum;
......
for(ucCmdNum=0;ucCmdNum
#define SQUARE(a)((a)*(a))
int a=5;
int b;
b=SQUARE(a++);//a 被加了 2 次 a=7,b=25
试题 3:华为全套完整试题
2、有一个 16 位的整数,每 4 位为一个数,写函数求他们的和。
解释:
整数 1101010110110111
和 1101+0101+1011+0111
/* n 就是 16 位的数,函数返回它的四个部分之和 */
char SumOfQuaters(unsigned short n)
{
char c = 0;
int i = 4;
do
{
c += n & 15;
n = n >> 4;
} while (--i);
return c;
}
试题 4:(慧通)
1、 写出程序把一个链表中的接点顺序倒排
typedef struct linknode
{
int data;
struct linknode *next;
}node;
//将一个链表逆置
node *reverse(node *head)
{
7
node *p,*q,*r;
p=head;
q=p->next;
while(q!=NULL)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
head->next=NULL;
head=p;
return head;
}
2、 写出程序删除链表中的所有接点
void del_all(node *head)
{
node *p;
while(head!=NULL)
{
p=head->next;
free(head);
head=p;
}
cout<<"释放空间成功!"<