1、引用与指针有什么区别?
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。
2、什么是平衡二叉树?
左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1
3、堆栈溢出一般是由什么原因导致的?
没有回收垃圾资源
4、给两个变量,如何找出一个带环单链表中是什么地方出现环的?
一个递增一,一个递增二,他们指向同一个接点时就是环出现的地方
5、如何引用一个已经定义过的全局变量?
可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
6、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。
7、对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
c用宏定义,c++用inline
8、写一个“标准”宏,这个宏输入两个参数并返回较小的一个。
#define Min(X, Y) ((X)>(Y)?(Y):(X))
9、交换两个变量的值,不使用第三个变量。
有两种解法, 一种用算术算法, 一种用^(异或)
a = a +b;
b = a -b;
a = a -b;
or
a =a^b;// 只能对int,char..
b = a^b;
a = a^b;
or
a ^= b^= a;
10、c和c++中的struct有什么不同?
c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。
c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private
11、什么是预编译,何时需要预编译:
1)总是使用不经常改动的大型代码体。
2)程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。
12、数组地址、指针问题
char str1[] ="abc";
char str2[] ="abc";
const char str3[]= "abc";
const char str4[]= "abc";
const char *str5 ="abc";
const char *str6 ="abc";
char *str7 ="abc";
char *str8 ="abc";
cout << (str1 == str2 ) << endl;
cout << (str3 == str4 ) << endl;
cout << (str5 == str6 ) << endl;
cout << (str7 == str8 ) << endl;
结果是:0 0 1 1
解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;
而str5,str6,str7,str8是指针,它们指向相同的常量区域。
13、C++ 用宏定义写出swap(x,y)交换函数
//C++ 用宏定义写出swap(x,y)交换函数,多行语句可用'\'连接
#define swap(x, y)\
x = x + y;\
y = x - y;\
x = x - y;
14.地址偏移
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
输出:2,5
*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5
&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)
int *ptr=(int*)(&a+1);
则ptr实际是&(a[5]),也就是a+5
原因如下:
&a是数组指针,其类型为 int (*)[5],而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。
a是长度为5的int数组指针,所以要加 5*sizeof(int),即ptr实际是a[5]
但是prt与(&a+1)类型是不一样的(这点很重要)
所以prt-1只会减去sizeof(int*)
a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(数
组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].
15.如果只想让程序有一个实例运行,不能运行两个。
把这两行代码插入程序初始位置即可(需要包含:<stdlib.h> & <windows.h> ) :
CreateMutex(NULL,FALSE,"YourAppName");
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
exit(0);
}
16.定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
#define MAX(a,b) ( abs((a)-(b)) == ((a)-(b))?(a):(b) )
17.x=x+1,x+=1,x++哪个效率最高?为什么?
x=x+1 效率最低
1)读取右x地址
2)x+1
3)读取左x地址
4)将右值传给左x
x+=1 其次
1)读取右x地址
2)x+1
3)将得到的值传给x(x的地址已经读出,故不用读取)
x++ 效率最高
1)读取右x地址
2)x自增1
故x++效率最高。
18.打印出当前源文件的文件名以及源文件的当前行号
#include<stdio.h>
void main()
{
printf("当前源文件名:%s",__FILE__);
printf("源文件当前行号:%ld",__LINE__);
}
19.main主函数执行完毕后再执行一段代码
/* ATEXIT.C: This program pushes four functions onto
* the stack of functions to be executed when atexit
* is called. When the program exits, these programs
* are executed on a "last in, first out" basis.
*/
#include <stdlib.h>
#include <stdio.h>
void fn1( void ), fn2( void ), fn3( void ), fn4( void );
void main( void )
{
atexit( fn1 );
atexit( fn2 );
atexit( fn3 );
atexit( fn4 );
printf( "This is executed first. " );
}
void fn1()
{
printf( "next. " );
}
void fn2()
{
printf( "executed " );
}
void fn3()
{
printf( "is " );
}
void fn4()
{
printf( "This " );
}
/*
Output
This is executed first.
This is executed next.*/
递归和分治策略:http://www.cnblogs.com/chinazhangjie/archive/2010/10/07/1845034.html