C/C++面试题(一)

 

1、局部变量能否和全局变量重名?

  答:能,局部会屏蔽全局。局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

 

2、如何引用一个其它文件已经定义过的全局变量?

  答:可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

 

3、用变量a给出下面的定义

  a) 一个整型数
b)一个指向整型数的指针
c)一个指向指针的的指针,它指向的指针是指向一个整型数
d)一个有10个整型数的数组
e) 一个有10个指针的数组,该指针是指向一个整型数的
f) 一个指向有10个整型数数组的指针
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数

3、用变量a给出下面的定义_

答案是:

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an integer

d) int a[10]; // An array of 10 integers

e) int *a[10]; // An array of 10 pointers to integers

f) int (*a)[10]; // A pointer to an array of 10 integers

g) int (*a)(int); // A pointer to a function a that takes an integer          argument and returns an integer

h) int (*a[10])(int); // An array of 10 pointers to functions that   take an integer argument and return an integer

 

a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
 
指针的数据类型
定义含义
int  i;    定义整形变量i
int  *p;    p为指向整形数据的指针变量
int  a[n];    定义整形数组a, 它有n个元素
int *p[n];    定义指针数组p, 它由n个指向整形数据的指针元素组成
int  (*p)[n];    p为指向含n个元素的一维数组的指针变量
int f();    f为带回整形函数值的函数
int *p();    p为带回一个指针的函数,该指针指向整形数据
int (*p)();    p为指向函数的指针,该函数返回一个整形值
int **p;    p是一个指针变量,它指向一个指向 整形数据的指针变量
  
 

4、关键字static的作用是什么?

1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

 

5、关键字const有什么含意?

  const意味着“只读”。另外,const可以使编译器很自然地保护那些不希望被改变的变量或参数(用const修饰),防止其被无意的代码修改。

 

下面的声明都是什么意思?

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

 

6、关键字volatile有什么含意?

  一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

  1) 并行设备的硬件寄存器(如:状态寄存器);

  2) 一个中断服务子程序中会访问到的非自动变量(Non-  automatic variables);

  3) 多线程应用中被几个任务共享的变量。

 

7、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

  可以,在不同的C文件中以static形式来声明同名全局变量。在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

 

8、设有以下说明和定义:

typedef union{

  long i;

  int k[5];

  char c;

} DATE;

struct data{

  int cat;

  DATE cow;

  double dog;

} too;

DATE max;

则语句printf("%d",sizeof(struct data)+sizeof(max));的执行结果是:___

9、请找出下面代码中的所有错误(说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”)

#include"string.h"

int main(){

  char*src="hello,world";

  char* dest=NULL;

  intlen=strlen(src);

  dest=(char*)malloc(len);

  char* d=dest;

  char* s=src[len];

  while(len--!=0){

  *d=*s--;

             d++;}

  printf("%s",dest);

  return 0;

}

 

10、队列和栈有什么区别?

11
、对于一个频繁使用的短小函数,C语言中应用什么实现,C++中应用什么实现?

12
、软件测试都有那些种类?

13
、确定模块的功能和模块的接口是在软件设计的哪个阶段完成的?

14、计算表达式值?

unsigned char *p1;

unsigned int *p2;

p1=(unsigned char *)0x801000;

p2=(unsigned int *)0x810000;

请问:

       p1+5=  ;

       p2+5=  ;

 

15、进程和线程的差别?

线程是指进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别:

(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位;

(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行;

(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源;

(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

 

16Heapstack的差别。

Heap是堆,stack是栈。

Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。

Stack空间有限,Heap是很大的自由存储区

C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。

程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行。

 

17、解释下列输出结果

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;

18、以下代码中的两个sizeof用法有问题吗?

void UpperCase( char str[] ) // 将小写字母转换成大写字母

{

  for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )

  if( 'a'<=str && str<='z' )

  str -= ('a'-'A' );

}

char str[] = "aBcDe";

cout << "str字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;

UpperCase( str );

cout << str << endl;

 

18、以下代码中的两个sizeof用法有问题吗?

函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。

注意:数组名作为函数参数时,退化为指针.

数组名作为sizeof()参数时,数组名不退化,因为sizeof不是函数.

 

19、指出下面代码的输出,并解释为什么?

main()

{

int a[5]={1,2,3,4,5};

int *ptr=(int *)(&a+1);

printf("%d,%d",*(a+1),*(ptr-1));

}

   &a是数组指针,其类型为int (*)[5]&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小,即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]

 

 

 

 

 

20、请问以下代码有什么问题?

int main()

   {

  char a;

  char *str=&a;

  strcpy(str,"hello");

  printf(str);

  return 0;

  }

 

没有为str分配内存空间,将会发生异常

问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章