欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C/C++笔试题目(深圳某公司)

程序员文章站 2022-05-06 20:29:10
...

1.C++编译器提供的四个缺省函数

可参考这个博客
当时自己就想到了默认构造函数和析构函数,后面的两个没有想到(拷贝构造函数、赋值函数,这两个函数也比较重要并且比较容易混淆)

2.引用和指针的区别

本质区别:引用是别名,指针是地址

  • 从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。
  • 从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对象。引用不能指向空值,引用和引用的变量共用同一块内存空间。

3.态内存区、栈内存区和堆内存区

可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。

  • 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。
  • 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
  • 堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。

4.程序哪部分出错

char string[10],str[10];
for(int i=0;i<10;i++)
{
	str[i]=i;
}
strcpy(string,str);

字符串在c/c++中是以字符数组的形式存储的,仔细查找会发现在对字符数组进行初始化时没有添加字符串结束标志‘\0’。字符串的初始化的两种方式

char a[]=“hello”;  //字符数组逐个存入,最后自动存入’\0‘
char a[]={'h','e','l','l','o','\0'};
//或者利用循环对字符数组逐个存入,最后显式存入’\0‘

5.如何从外部调用类的私有变量

可参考这篇博客
即通过指针访问(因为对象本身作为一个地址值,里面存放的只有虚函数指针和成语变量,如果没有虚函数指针那么就可以直接访问到第一个成员变量,且一个对象的大小就是这些,没有成员函数,没有static的成员变量。类的大小是虚函数表和一般的成员变量,也没有成员函数。成员函数放在代码区。) ,以及通过类的函数访问。

6.单链表进行排序

题目:学生包括学号和成绩,利用单链表,按照学生的成绩从高到低对其进行排序操作。

对于单链表而言,在进行编写的时候如果直接进行节点间赋值操作,一定注意:不要忽略赋值后,不只是节点的值发生了变化,其next指针的指向也发生了变化。如果担心出错,逐个对结构体中的值进行copy。

#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
typedef struct student{
	char id[20];
	double score;
	struct student *next;
}stu; 
//头插法创建单链表 
void CreateList(stu *head);
//尾插法创建单链表 
void CreateList2(stu *head);
//对单链表进行排序 
void SortList(stu *head);
void PrintList(stu *head);
int main(void)
{
	stu *p=(stu *)malloc(sizeof(stu));
	p->next=NULL;
	CreateList2(p);
	PrintList(p);
	printf("\n");
	SortList(p);
}

void CreateList(stu *head)
{
	stu *p;
	double num;
	while(scanf("%lf",&num),num>=0)
	{
		
		p=(stu *)malloc(sizeof(stu));
	   //结构指针变量名用->,结构变量用点 来对成员进行访问 
		p->score=num;
		scanf("%s",p->id);
		p->next=head->next;
		head->next=p;
	}
}
void CreateList2(stu *head)
{
	stu *p,*rear=head;
	double num;
	while(scanf("%lf",&num),num>=0)
	{
		
		p=(stu *)malloc(sizeof(stu));
	   //结构指针变量名用->,结构变量用点 来对成员进行访问 
		p->score=num;
		scanf("%s",p->id);
		rear->next=p;
		rear=p;
	}
	rear->next=NULL;
}
void PrintList(stu *head)
{
	stu *p=head->next;
	while(p)
	{
		printf("%.2f %s\n",p->score,p->id);
		p=p->next;
	}
}
void SortList(stu *head)
{
	stu *p=head->next;
	stu *q=NULL;
	stu *r=NULL;
	stu tmp;
	int val;
	for(;p->next!=NULL;p=p->next)
	{
	
		for(q=p->next;q!=NULL;q=q->next)
		{
			if(p->score<q->score)
			{
				tmp = *p;
				*p = *q;
				*q = tmp;
				
				//赋值操作时,其next的指向也互换了,需要再换回来
				r=q->next;
				q->next=p->next;
				p->next=r;
				/*也可以采用中间变量对p,q节点中的除next的其余成员逐个进行交换操作*/

			}
		}
	}
	PrintList(head);
}
/*
测试数据 
21
1201
23
1202
22
1203
-1
*/