您的位置:首页 > 编程语言 > C语言/C++

C++备忘(更新中...)

2010-09-10 18:07 309 查看
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.*/

递归和分治策略:/article/5116368.html

重载、重写、覆盖:http://www.cnblogs.com/cuboo/articles/1564607.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: