c语言面试题重点整理·基础类

来源:互联网 发布:黑暗迪迦官方数据无限 编辑:程序博客网 时间:2024/05/17 22:42


最近又面临面试把这些常见的题型记录一下,不足的地方后面再补充:


(1) 对const的理解


   定义:语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier),就只能修改为只读变量

   指针和const的搭配来考察:

   1)、const在前面
  const char *pContent; //*pContent是const, pContent可变
  const (char *) pContent; //pContent是const,*pContent可变
  char* const pContent; //pContent是const,*pContent可变
  const char* const pContent; //pContent和*pContent都是const 
    2)、const在后面,与上面的声明对等
  char const * pContent; // *pContent是const, pContent可变
  (char *) const pContent; //pContent是const,*pContent可变
  char* const pContent; // pContent是const,*pContent可变
  char const* const pContent; // pContent和*pContent都是const

    例题:

1)已知const char * node="ABC";下列语句合法的是___.(D)

  • node[2] = 'k';
  • *node[2]='k';
  • *node = "xyz";
  • node="xyz";//node指向的内容不可改变,但是可以改变node的指向
2)有以下表达式:
int a=248, b=4;int const c=21;const int *d=&a; int *const e=&b;int const *f const =&a; 
请问下列表达式哪些会被编译器禁止?(A B C D)
  • c=32//变量c的值不可改变
  • *d=43//d指向的内容不能被修改
  • e=&a //e指向地址不能改变
  • f=0x321f   //都不能改变
  • d=&b
  • *e=34


(2)#define 和 typedef
  定义:
 1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错;
 2) typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名;

 例题: 
#define DOUBLE(x) x+x i = 5*DOUBLE(5)
求i的值(30)


(3)关键字static
  作用:
   1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
   2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
   3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。


  
 (4)特定比特位置0和1
  #define set_bit(val,bit)  val |= 1<<bit
  #define clr_bit(val,bit)  val &= ~(1<<bit)



  (5)sizeof 和strlen    
    sizeof是算符,strlen是函数,sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的;
   
例题:
(1)在linux下64位c程序,请计算输出的三个sizeof分别是()(6,8,8)
void func(char str_arg[100]){     cout<<sizeof(str_arg)<<endl;}int main(int argc,char* argv[]){     char str[]="Hello";     char *p=str;     cout<<sizeof(str)<<endl;     cout<<sizeof(p)<<endl;     func("test");     return 0;}

(2)请写出下面代码在32位和64位操作系统下的输出结果。
void_test(){     char x[]="10jqka";     char y[20]="10jqka";     printf("%d,%d,%d,%d,%d,%d",     sizeof(char),sizeof(char*),     sizeof(x),strlen(x),     sizeof(y),strlen(y),}
答案:
32位:1,4,7,6,20,6
64位:1,8,7,6,20,6

(3)在32位系统中:
char arr[] = {4, 3, 9, 9, 2, 0, 1, 5};
char *str = arr;
求:
sizeof(arr) = ;8
sizeof(str) = ;4
strlen(str) = ;5

(4)struct type{
char a;
int b;
short c;
double d;
}test;
求该结构题大小:(16)



(6)指针和数组
   int *a[]; //指针a指向这个数组
   int (*b)[]; 数组指针,每个指针指向一个整型变量
   
   例题:
   
(1)下列代码的结果是
main() {     int a[5]={1,2,3,4,5};     int *ptr=(int *)(&a+1);     printf("%d,%d",*(a+1),*(ptr-1)); }
  • 3,5
  • 2,4
  • 2,5
  • 3,4
答案是C;注意a指向整个数组,&a + 1就表示指向这个数组的末尾后面的5个单元,*(ptr  - 1)就指向最后一个元素;

(2)
若有以下定义和赋值语句,则与&s[i][j]等价的是()(C)
int s[2][3] = {0}, (*p)[3], i, j;p = s;i = j = 1;
  • *(*(p+i)+j)
  • *(p[i]+j)
  • *(p+i)+j
  • (*(p+i))[j]
(3)求输出结果 
int a[2][2][3]= { {{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}}};int *ptr=(int *)(&a+1);printf(“%d %d”, *(int*)(a+1), *(ptr-1));
  • 7 12
  • 1 6
  • 1 3
  • 7 9
答案: A;a指向三维数组,&a+1指向数组的下一个位置。*(ptr-1)指向数组的最后一个元素,数组的最后一个元素为12。a+1指向a[1][0][0]的位置,该位置的元素为7

 (7) i++和++i

  i++在该语句执行完自加1,++i是先加1;

 例题:

 (1)i=4,那么语句:j=i+++1,执行后的结果应该是()(B)

  • i=4,j=6
  • i=5,j=5
  • i=5,j=6
  • i=6,j=6

答案:B 




0 0
原创粉丝点击