零零散散的笔试面试题目


记一点笔试面试的小题目吧


1.malloc和new的区别是什么?


1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
3,因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
4,C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

5、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。

一:new delete 是运算符,malloc,free是函数

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。

因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。



2.在C#语言中,重载和重写的区别到底在什么地方?


在C#中我不敢妄言。因为我是用java的,在这个方面二者相差不多,我就说说java吧。

重写一般是指父类和子类之间,子类重写了父类的一个方法,当然方法名是一样的,而且不能改变父类方法的返回值,比如说父类是返回String,子类重写了这个方法,想返回一个int,那是不行的,也得返回String。

重载是一个类里面,写了多了同名的方法,各个方法的返回值类型可以不一样。要注意区分重载方法可以通过参数列表的个数,类型和顺序。但是不推荐用顺序来进行重载,这会让代码可读性极差。


3.分析


int main(){

	char str1[]="hello world";
	char str2[]="hello world";

	char * str3 = "hello world";
	char * str4 = "hello world";

	if(str1 == str2)
		cout<<"str1 = str2"<<endl;
	else
		cout<<"str1 != str2"<<endl;

	if(str3 == str4)
		cout<<"str3 == str4"<<endl;
	else
		cout<<"str3 != str4"<<endl;

	return 0;

}
/**
 * 结果:
 * 	str1 != str2
	str3 == str4
 *
 * str1 和 str2 是两个字符串,分配了12个字节的存储空间,并把“hello world”的内容复制到数组中去,地址不同
 * str3 和 str4 是两个指针,我们无需为他们分配内存及存储字符串的内容,只需要把他们指向"hello world"在内存中的地址就可以了。
 * 由于hello world 是常量字符串,他们在内存中只有一个copy,因此他们指向一个相同的地址
 */


4.字符串反转


<span style="font-size:14px;">#include <iostream>
#include <cstring>
using namespace std;

char * reverse(const char *s){
	//reverse a string
	int len = strlen(s);
	char *temp = new char[len];
	for(int i=len ;i>=0;--i){
		temp[len-i] = s[i-1];
	}
	return temp;
}


int main(){

    char s[] = "hello world";
    cout<<s<<endl;
    char *t;
	t = reverse(s);
	cout<<t<<endl;
	return 0;
}
//output:
//hello world
//dlrow olleh</span>


5.字符串反转2   

(leetcode 1题)Reverse Words in a String


单词的样子不变,但是单词的顺序反转

Given s = "the sky is blue",
return "blue is sky the".

需要考虑的问题:尾部的空格?   2个或多个相邻的空格? 最前面有空格但是你又不能输出的


参考我的leetcode第一题:   点击打开链接


6.const *  与   *const

int num = 500;
const int *a = & num;//指针指向的内容为常量,即“*a = 499"是错的,num的值可以修改
int const *b = & num;//同上
int *const c = & num;//指针c本身是常量,即c指向的内容是常量,”c--;"是错的
const int * const d = & num;//指针本身及其所指向的内容均为常量
/**
 * 规则:
 * 1.const位于*左侧,则const修饰的是指针所指向的变量,即指针指向一个常量
 * 2.const位于*右侧,则const修饰指针本身
 */


int main() {

	*a = 499; //error
	a++;      //ok
	*c = 300; //ok
	(*c)--;   //ok
	*c--;     //error

	return 0;
}
eclipse下outline中的内容:
零零散散的笔试面试题目_第1张图片


7.strcpy 与 memcpy的区别   (中兴一面面试题)

 
  
 
 
strcpy与memcpy的区别:
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

strcpy和memcpy都是标准C库函数,它们有下面的特点。
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。

已知strcpy函数的原型是:

char* strcpy(char* dest, const char* src);
memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
void *memcpy( void *dest, const void *src, size_t count );  //第三个参数决定长度



8.指针和引用的区别


1.一个引用必须总是指向摸个对象,不可指空

2.使用引用不需要测试合法性,指针应总是检测其合法性

3.指针可以更改指向不同的对象,而引用不可以更改

attention:

1.不能建立引用的数组,因为数组是个地址,他不是一个名副其实的数据类型

2.引用本身不是数据类型


其它:

c++中函数传递方式有3种:

1,,按值传递

2,指针传递

3,引用传递(和指针传递作用相同,引用传递可提高可读性)

引用(reference)不是值,不占内存,是一个别名

引用运算符与地址符相同,但彼此关联

引用运算符只在声明时使用,他放在类型名后面,其它任何 & 的使用都是为地址操作符

引用传递也被用作一种传递大对象的机制,特别对象非常大的时候,按值传递会耗时较多,而引用传递不需要进行复制,比较高效。

在使用引用传递时最好使用const。

你可能感兴趣的:(零零散散的笔试面试题目)