C 语言常见面试题

来源:互联网 发布:公路计算软件 编辑:程序博客网 时间:2024/05/16 18:50

1 #define 与 typedef的区别
 (1 #define是预处理指令,在预处理时进行替换,其后边没有分号;
 (2 typedef是在编译时处理的,

  使用时注意:
 1例:#define PINT int *
      typedef int *  pint
 PINT a,b;  相当于int *a,b; 只定义了一个指针
 pint a,b;  是定义了两个指针,(#define 只是简单的替换,而typedef 是给已经存在的类型起个别名,是声明了一种类型)
        2 例 :接上例
   const PINT a;和const pint a;区别
      const PINT a;(相当于 const int *a,const 限定的是*a,a指向的内容只读)
   const pint a;(pint是一种类型,限定的是a,a不能指向别处)


2 带参数的宏定义和函数的比较
 宏定义的优点:
 1 速度快,省去了函数的许多额外的时间开销(保存上下文信息,参数入栈,参数拷贝)
 2 通用性强,宏的参数不进行类型检查,一个宏可以带各种类型参数
 宏定义的缺点:
 1 编译后的代码变大,由于是简单的替换,尤其是频繁时使用该宏,或是宏嵌套;
 2 由于不进行参数类型检查,当出现类型错误时调试会很麻烦
 3 宏定义不能使用函数指针,有时很不方便;
 4 宏会对参数进行多次计算,如MIN(a++,b)当宏中用了几次a,a就自加了几次;

3 指针数组和数组指针(一个由指针组成的数组和一个指向数组的指针)
 一个有10个指针的数组  int *a[10];
 一个指向有10个整型数数组的指针 int (*a)[10] (使用时也是*a[3]代表其第四个数据;用法:printf(“%d”,(*a)[3]);

4 static的作用
 1 在函数体内时,如果一个变量被定义成static变量,该变量被存在data区,表示该函数被调用过程中,该变量的值保持不变,(变量保持上次调用后的值)
 2 当变量在模块内而在函数外时,表示该变量只能被本模块内的函数使用,不能被其他模块的函数使用,
 3 当一个函数被定义成const时,只该函数只能被本模块的函数调用;

 使用static时注意: 一个全局变量定义成static变量,则别的模块不能通过extern 使用该变量,但可以定义一个名字相同的变量,但不是同一个变量;就像全局变量a 和局部变量a不是一个变量一样;

5 const 的使用
 const的含义 只要能说出const意味着“只读”就可以了
 下边几个定义的含义
 int const a;
 const int a;这两个的含义相同
 const int *a; const限定的是*a
 int * const a;  限定的是a(不能指向别处)
 int const * const a;(指向的内容不变,指针也不能指向别处)

6 volatile
 精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份

7  下边的代码输出
Void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ?puts("> 6") : puts("<= 6");
}
当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型 ,则-20成了一个很大的数

8 what will print out;
Main()
{
char *p1=“name”;
char *p2;
p2=(char*)malloc(20);
memset (p2, 0, 20);
while(*p2++ = *p1++);   //等号表达式的结果就是等号左边被赋予的那个值
printf(“%sn”,p2);
printf(“%sn”,p1);
}
answer :both are empty string;

9  sizeof()和strlen

 sizeof() 算\0;strlen不算

10 数组与指针
 数组名相当于指针常量
 int a[10];中a 相当于int * const a;


 

0 0
原创粉丝点击