程序员面试宝典(C++例题)

合集下载

关于c的面试题目(3篇)

关于c的面试题目(3篇)

第1篇一、基础知识点1. 请简述C语言的发展历程。

C语言是由美国贝尔实验室的Dennis Ritchie在1972年发明的,它是一种高级程序设计语言,具有丰富的数据类型和运算符,广泛应用于系统软件、应用软件和嵌入式系统等领域。

C语言的发展历程大致可以分为以下几个阶段:(1)1972年:Dennis Ritchie开始设计C语言。

(2)1973年:C语言的第一个版本0.1发布。

(3)1975年:C语言的第一个正式版本C1发布。

(4)1978年:Brian Kernighan和Dennis Ritchie合著的《C程序设计语言》出版,使得C语言迅速流行。

(5)1983年:C语言的国际标准化组织(ISO)开始制定C语言标准,即C89标准。

(6)1990年:C语言的国际标准化组织发布了C90标准。

(7)2000年:C语言的国际标准化组织发布了C99标准。

2. 请简述C语言的特点。

C语言具有以下特点:(1)简洁、高效:C语言语法简单,执行效率高。

(2)跨平台:C语言编写的程序可以在不同的操作系统和硬件平台上运行。

(3)丰富的库函数:C语言提供了丰富的标准库函数,方便程序员进行编程。

(4)可移植性:C语言编写的程序具有较好的可移植性,可以在不同的环境下编译和运行。

(5)模块化:C语言支持模块化编程,便于代码的重用和维护。

3. 请简述C语言的数据类型。

C语言的数据类型分为以下几类:(1)基本数据类型:int、float、double、char等。

(2)枚举类型:enum。

(3)结构体类型:struct。

(4)联合体类型:union。

(5)指针类型:void。

(6)数组类型:数组是具有相同数据类型元素集合的实体。

4. 请简述C语言的基本语法。

C语言的基本语法包括:(1)标识符:标识符用于命名变量、函数、数组等。

(2)关键字:关键字是C语言中预定义的具有特殊含义的单词。

(3)运算符:C语言提供了丰富的运算符,包括算术运算符、关系运算符、逻辑运算符等。

cc++程序员面试宝典

cc++程序员面试宝典

cc++程序员面试宝典c/c++程序员面试宝典试题1:void test1(){char string[10];char* str1 = “0123456789″;strcpy( string, str1 );}试题2:void test2(){char string[10], str1[10];int i;for(i=0; i<10; i++){str1[i] = ’a’;}strcpy( string, str1 );}试题3:void test3(char* str1){char string[10];if( strlen( str1 ) <= 10 ){strcpy( string, str1 );}}解答:试题1字符串str1需要11个字节才能存放下(包括末尾的’’),而string只有10个字节的空间,strcpy会导致数组越界;对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string,str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;对试题3,if(strlen(str1) <= 10)应改为if(strlen(str1) <10),因为strlen的结果未统计’’所占用的1个字节。

剖析:考查对基本功的掌握:(1)字符串以’’结尾;(2)对数组越界把握的敏感度;(3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:2分void strcpy( char *strDest, char *strSrc ){while( (*strDest++ = * strSrc++) != ‘’ );}4分void strcpy( char *strDest, const char *strSrc )//将源字符串加const,表明其为输入参数,加2分{while( (*strDest++ = * strSrc++) != ‘’ );}7分void strcpy(char *strDest, const char *strSrc){//对源地址和目的地址加非0断言,加3分assert( (strDest != NULL) && (strSrc != NULL) );while( (*strDest++ = * strSrc++) != ‘’ );}10分//为了实现链式操作,将目的地址返回,加3分!char * strcpy( char *strDest, const char *strSrc ){assert( (strDest != NULL) && (strSrc != NULL) );char *address = strDest;while( (*strDest++ = * strSrc++) != ‘’ );return address;}从2分到10分的几个答案我们可以清楚的看到,小小的strcpy竟然暗藏着这么多玄机,真不是盖的!需要多么扎实的基本功才能写一个完美的strcpy啊!(4)对strlen的掌握,它没有包括字符串末尾的’’。

c面试试题及答案

c面试试题及答案

c面试试题及答案一、自我介绍你好,我是XXX,很高兴有机会参加C面试。

我具备扎实的编程基础和丰富的项目经验,在此次面试中,我将展示我的能力和潜力。

谢谢!二、C语言基础知识1. 请解释C语言中的指针(pointer)是什么?指针是一种变量,它存储了内存地址。

通过指针,我们可以直接访问和修改内存中的数据。

指针的灵活性使得我们可以在C语言中进行高效的内存管理和操作。

2. 请描述C语言中的动态内存分配的过程及对应的函数。

动态内存分配是在程序运行时按需分配和释放内存的过程。

在C语言中,使用malloc函数动态分配内存,使用free函数释放已分配的内存。

具体分配内存的大小和释放内存的时机需要根据具体需求来决定。

3. 什么是结构体(struct)?如何定义和使用结构体?结构体是一种自定义的数据类型,它可以将不同类型的数据按照一定的组织方式打包在一起。

在C语言中,我们可以使用struct关键字定义结构体,并通过点操作符(.)来访问结构体成员。

4. C语言中的位运算符有哪些,分别用于什么场景?C语言中常用的位运算符有按位与(&)、按位或(|)、按位异或(^),它们用于对二进制数进行位级操作。

位运算可以在一些特定场景中提高程序的运行效率,如位掩码、位标记等。

三、编程题请编写一个C语言程序,实现冒泡排序算法。

```c#include <stdio.h>void bubbleSort(int arr[], int size) {int i, j, temp;for (i = 0; i < size - 1; i++) {for (j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}int main() {int arr[] = {5, 2, 9, 3, 7};int size = sizeof(arr) / sizeof(arr[0]);bubbleSort(arr, size);printf("排序结果:");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}return 0;}```这个程序实现了冒泡排序算法,将数组中的元素按照升序排列,并输出排序结果。

c与c_面试题目(3篇)

c与c_面试题目(3篇)

第1篇第一部分:C语言基础1. 面试题:请解释C语言中的“变量声明”和“变量定义”的区别。

解析:- 变量声明:告诉编译器即将使用一个变量,但不分配存储空间。

它只告诉编译器变量的名称、数据类型和存储类别。

- 变量定义:不仅告诉编译器变量的名称、数据类型和存储类别,还分配存储空间给变量。

```cint i; // 变量声明int i = 10; // 变量定义```2. 面试题:什么是内存泄漏?如何检测和避免内存泄漏?解析:- 内存泄漏:在程序运行过程中,由于疏忽或错误,导致已分配的内存没有被释放,导致内存占用逐渐增加,最终可能耗尽系统内存。

- 检测内存泄漏:可以使用工具如Valgrind、Sanitizer等来检测内存泄漏。

- 避免内存泄漏:- 确保所有分配的内存在使用后都被释放。

- 使用智能指针(如C++中的`std::unique_ptr`、`std::shared_ptr`)来自动管理内存。

```cvoid function() {int ptr = malloc(sizeof(int)); // 分配内存// 使用ptr...free(ptr); // 释放内存}```3. 面试题:请解释C语言中的指针和数组的关系。

解析:- 在C语言中,数组名本身就是一个指向数组首元素的指针。

- 可以通过指针访问数组元素,也可以通过数组下标访问。

```cint arr[10];int ptr = arr; // ptr指向数组的第一个元素int value = (ptr + 5); // 访问数组中索引为5的元素```4. 面试题:请解释C语言中的结构体(struct)和联合体(union)的区别。

解析:- 结构体:可以包含不同数据类型的成员,每个成员都有自己的内存空间。

- 联合体:所有成员共享同一块内存空间,在某一时刻只有一个成员有效。

```cstruct {int a;float b;} s;union {int a;float b;} u;```第二部分:C++基础1. 面试题:请解释C++中的构造函数和析构函数。

c的面试题及答案

c的面试题及答案

c的面试题及答案面试题一:请解释一下C语言的指针和引用的区别。

答案:在C语言中,指针和引用都是用来处理内存地址的。

它们的主要区别在于以下几个方面:1. 定义和使用方式:- 指针是一个变量,存储的是一个内存地址。

通过使用"*"操作符可以获取或修改该地址对应的值。

- 引用则是一个已存在对象的别名。

它在定义时需要和原对象进行绑定,并且无法更改绑定的对象。

2. 空指针和无效引用:- 指针可以被赋值为空指针(NULL)或无效的地址值,表示指针不指向任何有效的内存地址。

- 引用必须在定义时进行初始化,并且必须引用一个有效的对象。

3. 内存管理:- 指针需要显式地通过动态内存分配函数(如malloc())进行内存的分配和释放。

- 引用的内存管理则由编译器自动处理,无需手动管理。

4. 数组和函数的传递:- 指针可以用于处理数组或者作为函数的参数进行传递。

- 引用可以作为函数参数,但无法直接用于处理数组。

面试题二:请解释C语言中的堆和栈的区别。

答案:在C语言中,堆和栈是两种不同的内存分配方式,具有以下区别:1. 分配方式:- 栈是由编译器自动分配和释放的,它的空间有限,大小在编译时就已经确定。

- 堆是由程序员手动分配和释放的,它的空间相比栈更大,并且大小在运行时可动态调整。

2. 内存结构:- 栈的数据结构为“先进后出”的方式,即后进栈的数据先出栈。

- 堆则没有明确的数据结构,按照动态分配顺序分配内存。

3. 分配效率:- 栈的分配和释放速度要快于堆,因为栈只需要移动栈顶指针即可。

- 堆的分配和释放速度相对较慢,因为需要在运行时进行内存的动态分配和回收。

4. 使用方式:- 栈主要用于存储局部变量、函数调用和函数参数等数据。

- 堆主要用于存储动态分配的内存,如通过malloc()函数分配的内存块。

面试题三:请解释C语言中的宏定义和常量的区别。

答案:在C语言中,宏定义和常量都可以用来表示不可更改的值,但它们的区别如下:1. 定义方式:- 宏定义使用“#define”关键字进行定义,没有数据类型限制。

程序员面试宝典csdn

程序员面试宝典csdn

程序员面试宝典csdn1. What will be the output of the following C code?#includeint main(int argc, char* argv[]) { int b=3;int arr[] = {6, 7, 8, 9, 10}; int *ptr = arr; *(ptr++) += 123;printf("%d, %d ", *ptr, *(++ptr)); return 0;}2. 下面程序的结果是多少?#includeint main(int argc, char* argv[]) { unsigned char a = 0xA5; unsigned char b = ~a>>4; printf("b = %d ", b); return 0; }3. 下面程序的结果是:#includeint main(int argc, char* argv[]) { unsigned int a = 0xFFFFFFF7; unsigned char i = (unsigned char)a; char * b = (char *)&a; printf("%08x, %08x ", i, *b);return 0;}4. 用一个表达式,判断一个数X是否为2的N次方(2,4,8,…),不可用循环语句。

5. 下面程序的结果是:#include#includeusing namespace std; int main(int argc, char* argv[]) { int count = 0; int m = 9999; while(m){ count++; m = m & (m - 1);}cout << count << endl; return 0;}6. 不用判断语句,找出两个数中比较大的。

c语言面试宝典(计算机专业面试必备)

c语言面试宝典(计算机专业面试必备)
004010708A4201moval,byteptr[edx+1]
004010738845FCmovbyteptr[ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。
21、什么是预编译,何时需要预编译?
heap:需要程序员自己申请,并指明大小,在c中malloc函数
如p1=(char*)malloc(10);
在C++中用new运算符
如p2=(char*)malloc(10);
但是注意栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
19、程序的内存分配
答:一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
strcpy(p1,"123456"); //123456\0放在常量区,编译器可能会将它与p3所向"123456"优化成一个地方。
}
20、解释堆和栈的区别
答:堆(heap)和栈(stack)的区别
(1)申请方式
stack:由系统自动分配。例如,声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间
15、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
答 、可以,在不同的C文件中以static形式来声明同名全局变量。

c面试题及答案

c面试题及答案

c面试题及答案1. c++中指针的优缺点有哪些答案:优点:(1)提高程序的编译效率和执行速度。

(2)通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯。

(3)可以实现动态的存储分配。

(4)便于表示各种数据结构,编写高质量的程序。

缺点:(1)使用未正确初始化的指针导致程序崩溃(2)引用已释放的指针(3)通过指针访问不该访问的内存2. 宏和函数的区别答案:(1)宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型。

(2)宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,是计算得来的。

(3)宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数是编译之后,在执行时,才调用的。

因此,宏占用的是编译的时间,而函数占用的是执行时的时间。

(4)宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,是占用内存的。

(5)函数的调用是需要付出一定的时空开销的,因为系统在调用函数时,要保留现场,然后转入被调用函数去执行,调用完,再返回主调函数,此时再恢复现场,这些操作,显然在宏中是没有的。

3. 宏定义是什么时期处理的(预处理?编译期?)答案:预处理4. 不同情况下类对象的大小(有数据成员,无数据成员,有虚函数等)答案:(1)无任何数据成员和虚函数的类大小为1(2)每个虚函数大小为4(3)成员变量大小要考虑内存对齐,通常是4字节对齐5. STL中vector使用的时候要注意什么答案:(1) 如果元素是对象的指针,当该vector超出其作用域或调用erase删除元素时,那么元素本身在该vector中会被删除,但对象本身并没有得到销毁。

在这种情况下,销毁的工作要由程序员自己来做。

(2) 用erase删除vector容器中的元素对象时,元素对象的析构函数会被多次调用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
while(pnode!=NULL)
{
if(pnode->child!=NULL){
node* p0=pnode->child,*p1=p0;
while(p1->next!=NULL) p1 = p1->next;
node*pp1 = pnode->next;
pnode->next = p0; p1->next = pp1;
(2)从首字母开始,判断其是否还有相同字母,类似排序,O(n2)
5.4删除特定字符
对remove建立hash数组,字符为key;遍历str字符串,如果字符在remove中则不拷贝,否则拷贝前移。效率在O(n+m)。
5.5颠倒单词的出现顺序
对字符串进行反向遍历,找到空格则复制单词。
5.6整数/字符串之间的转换
对这个链表进行扁平化,使全体节点都出现在一个只有一个层次的双向链表里。已知条件只有原多层次双向链表的第一层次的头指针和尾指针。下面是各节点的C++语言struct定义:
struct node{
node *next;
node *prev;
node *child;
int value;
} ;
void ExpandList(node* pnode)
9.4导火索
ANS: burn wire1 from 2 endpoint and burn wire2 from 1 endpoint meanwhile,
When the wire1 burn out, burn wire2 the other endpoint.
It will spend 45 minutes when the wire2 burn out.
stl::pair<stl::set<node*>::iterator, bool> pl;
pl = pset.insert(p);
while(p->next!=NULL){
p=p->next;
pl = pset.insert(p);
if(pl.second==false) return true;
7.12生产者/消费者问题
第8章与技术、测量、排序有关的智力题
8.1开锁
ANS: take an example of 10, emulate the open and close, and then find the rule.
You will find that all the opened number is a square number, so the opened number is:
class Stack{
struct Node{
Type idata;
Node* pnext;
};
public:
Stack():isize(0),phead(NULL){}
~Stack(){
while(phead!=NULL){
Node*p = phead;
phead = phead->pnext;
Node* p = phead;
phead = phead->pnext;
delete p;
--isize;
ret = true;
}
return ret;
}
int Size(){
return isize;
}
private:
int isize;
Node* phead;
};
template<class Type>
9.5躲火车
ANS:
第10章计算机基础知识
10.3 C++和Java
10.4头文件
10.5 C存储类别
10.6 Friend类
10.7类与结构的区别
10.8父类与子类
10.9参数传递
10.10宏与Inline函数
10.11继承
10.12面向对象的程序设计
10.13与线程有关的程序设计问题
10.14废弃内存的自动回收
Delete函数只有一个输入参数,他就是那个将被删除的元素。InsertAfter函数由两个输入参数,第二个输入参数给出了新元素的取值,它将被插入到第一个输入参数所指定的元素的后面。当需要把新元素插入到链表的开头作为新的头元素时,函数InsertAfter的第一个输入参数(即被声明为element类型的那个输入参数)将被设置为NULL。如果执行成功,这两个函数将返回“1”;如果不成功,将返回“0”。
tout = phead->idata;
Node* p = phead;
phead = phead->pnext;
delete p;
--isize;
ret = true;
}
return ret;
}
int Size(){
return isize;
}
private:
int isize;
Node* phead;
element *head, *tail;
int Delete(element* elem)
{
int ret = 0;
if(elem==NULL) return ret;
if(elem==head)
{
if(head==tail)
head=(tail=NULL);
else
head = head->next;
};
3.5链表的尾指针
说明:有一个单向链表,它的元素全都是些整数。head和tail分别指向该链表第一个元素(即头元素)和最后一个元素(即尾元素)的全局性指针。请实现调用接口如下所示的两个C语言函数:
int Delete(element *elem);
int InsertAfter(element *elem, int data);
delete p1;
ret = 1;
}
return ret;
}
element *head,*tail;
int InsertAfter(element* elem, int data)
{
int ret = 0;
element *p = new element;
p->data = data;
p->next = NULL;
{
free(head);
head = head->next;
}
解答:
void RemoveHead(node *&head)
{
if(head==NULL) return;
node* p = head;
head = head->next;
free(p);
}
3.7链表中的倒数第m个元素
说明:给定一个单向链表,请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的最后一个元素(尾元素)将被返回。
8.3过桥
ANS: (2+1)(1)(5+10)(2)(2+1)==17
8.4找石头
ANS: 3 3 2
第9章与图形和空间有关的智力题
9.1船和码头
ANS:绳子rope
9.2数方块
ANS: 3*3*3-1*1*1=8
ANS: 4*4*4-2*2*2 = 56
9.3狐狸与鸭子
ANS: the duck could fly.
解答:
node* FindInvM(node* head, int m)
{
if(head==NULL) return NULL;
node* pm=head,*p=head;
int ipm=0;
while(p->next!=NULL)
{
p = p->next;
if(ipm<m) ++ipm;
else pm = pm->next;
if(elem==NULL)
{
if(head==NULL)
head = (tail=p);
else
{
p->next = head;
head = p;
}
ret = 1;
return ret;
}
else
{
element* p1=head;
while(p1!=NULL)
{
if(p1==elem) break;
1,4,9,16,25,36,49,64,81,100.
8.2三个开关
ANS: you need to touch the lamp. Firstly open the lamp for 1minute, then closed it, and open the next one. You should go to the room and touch the closed lamp to determine which the first warm lamp is.
}
void Push(int i){
Node* p = new Node;
p->idata = i;
p->pnext = phead;
phead = p;
++isize;
}
bool Pop(int& iout){
bool ret = false;
if(isize>0){
iout = phead->idata;
delete p;
相关文档
最新文档