C语言常见考点

一 :变量/符号定义
   1:标识符号的定义描述正确的是:
      A:字符和数字开始,可以包含字符、数字和下划线;
      B:数字开始,可以包含字符,数字和下划线;
      C:字符、数字和下划线开始,可以包含字符、数字和下划线;
      D:字符和下划线索开始,可以包含字符、数字和下划线;
      答案:C
     
   2:写出运行结果:
    {// test1
      char str[] = "world";    cout << sizeof(str) << ": ";
      char *p    = str;        cout << sizeof(p)   << ": ";
      char i     = 10;         cout << sizeof(i)   << ": ";
      void *pp   = malloc(10); cout << sizeof(p)   << endl;
    }
    6:4:1:4    
     
  
二:输入输出:  
    1:格式化输出左对齐使用:
      A:-L   B:+L   C:-   D:+
      答案:C       
     
    2:转化码 “%[^#@]s”将让scanf执行何动作??
      答案:
     
    3:printf("%d");,打印结果是什么??
      答案:(2367420)
           

三:优先级别
    1:int i=10, j=10, k=3; k*=i+j; k最后的值是?
       答案:60
      
    2:i最后等于多少?
        int i = 1;
        int j = i++;
        if((i>j++) && (i++ == j)) i+=j;

    答:
        i = 5

    3:
        unsigned short array[]={1,2,3,4,5,6,7};
        int i = 3;
        *(array + i) = ?
       
        答:
            4
 
四:控制语句
    1:对于同样的情况,switch() 和if ... else if ... if那种效
       率比较高,他们分别有什么优和缺点??尝试从编译和运行角
       度分别进行分析!
      答案:
     
    2:下面是C语言中两种if语句判断方式。请问哪种写法更好?为
       什么?
        int n;
        if (n == 10) // 第一种判断方式
        if (10 == n) // 第二种判断方式
      答案:如果少了个=号,编译时就会报错,减少了出错的可能行,可
            以检测出是否少了=


五:指针部分
    1:简要叙述NULL,null ,ASCII中NULL以及字符串为空的区别和
       相同!
      答案:
     
    2:申请内存之后,在内存释放之后,该内存指针应该为什么??
      答案:内存释放后为野指针,需要人为的将其设置为NULL;
     
    3:定义int * temp;
        以下三个语句分别代表什么意思?
        A: *temp ++;
        B: ++ *temp;
        C: * ++temp;
      答案:A  为先加加,后取VALUE!
            B  为对相应的VALUE增加了1;
            C  为和A一样的情况
               该部分主要涉及取内容的优先级和自加的优先级的问
               题!
              
    4:一个参数为int 类型,返回结果为int 类型的函数指针如何定
       义??
        一个函数数组如何定义呢??
        假设现在分别有
         int test1(int a);
         int test2(int a);
         int test3(int a);应该如何将其分别赋值给先前的数组?
         如何调用呢??
         假设我仅仅对
                   cmp[1] = &test2;
            后使用 (*cmp[0])(10);,在编译和运行中分别有什么后
            果??
       答案:
            int (*cmp)(int a);
            int ((*cmp[3])(int a));           
            cmp[1] = test2; 或者 cmp[1] = &test1;           
            调用 (*cmp[0])(var);
            编译过程有警告,运行过程访问非法地址异常退出!
           
    5:用变量a给出下面的定义
        a) 一个整型数(An integer)
        b)一个指向整型数的指针( A pointer to an integer)
        c)一个指向指针的的指针,它指向的指针是指向一个整型数( A
          pointer to a pointer to an intege)
        d)一个有10个整型数的数组( An array of 10 integers)
        e)一个有10个指针的数组,该指针是指向一个整型数的。(An
          array of 10 pointers to integers)
        f) 一个指向有10个整型数数组的指针( A pointer to an array
          of 10 integers)
        g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型
          数(A pointer to a function that takes an integer as an
          argument and returns an integer)
        h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整
          型参数并返回一个整型数( An array of ten 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
        人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,
        我同意这种说法。当我写这篇文章时,为了确定语法的正确性,
        我的确查了一下书。但是当我被面试的时候,我期望被问到这个
        问题(或者相近的问题)。因为在被面试的这段时间里,我确定
        我知道这个问题的答案。应试者如果不知道所有的答案(或至少
        大部分答案),那么也就没有为这次面试做准备,如果该面试者
        没有为这次面试做准备,那么他又能为什么出准备呢?                    

六:函数部分
    1:函数的参数传递有几种方式??分析其优缺点?


                   
七:宏使用           
    1:简要叙述宏和函数使用的优和缺点??
      答案:
   
    2:下题的结果是什么??
    #include "stdafx.h"
    #define SQR(X) X*X
   
    int main(int argc, char* argv[])
    {
        int a = 10;
        int k = 2;
        int m = 1;
       
        a /= SQR(k+m)/SQR(k+m);
        printf("%d\n",a);
       
        return 0;
    }
    这道题目的结果是什么啊?
   
    define 只是定义而已,在编择时只是简单代换X*X而已,并不经
    过算术法则的
    答:a /= k+m*k+m/k+m*k+m;
   
   
    3:用预处理指令#define 声明一个常数,用以表明1年中有多少秒
    (忽略闰年问题)
    #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
    我在这想看到几件事情:
        -> #define 语法的基本知识(例如:不能以分号结束,括号的
            使用,等等)
        -> 懂得预处理器将为你计算常数表达式的值,因此,直接写出
            你是如何计算一年中有多少秒而不是计算出实际的值,是更
            清晰而没有代价的。
        -> 意识到这个表达式将使一个16位机的整型数溢出-因此要用
            到长整型符号L,告诉编译器这个常数是的长整型数。
        -> 如果你在你的表达式中用到UL(表示无符号长整型),那么
            你有了一个好的起点。记住,第一印象很重要。
      
   
八:几个关键词的辨析:                          
    1:#include <test.h> 和#include "test.h"有什么区别??
      答案:
   
    2:int a = 0;
        extern int a;
        两个语句分别在编译的过程中执行什么操作??
      答案:          
   
九: const 的使用.
    1:const 符号常量;
    (1)const char *p
    (2)char const *p
    (3)char * const p
    说明上面三种描述的区别; 
   
        如果const位于星号的左侧,则const就是用来修饰指针所指
        向的变量,即指针指向为常量;
        如果const位于星号的右侧,const就是修饰指针本身,即指
        针本身是常量。
       
        (1)const char *p
       
         一个指向char类型的const对象指针,p不是常量,我们可
         以修改p的值,使其指向不同的char,但是不能改变它指向
         非char对象,如:
            const char *p;
            char c1='a';
            char c2='b';
            p=&c1;//ok             
            p=&c2;//ok             
            *p=c1;//error             
       
        (2)char const *p
            char const *p;
            char c1='a';
            char c2='b';
            p=&c1;//ok             
            p=&c2;//ok             
            *p=c1;//error   
       
       
        (3)char * const p
            char c1='a';
            char c2='b';
            char * const p = &c1;
       
            p=&c1;// error           
            p=&c2;// error            
            *p=c1;//ok   
       
            此时必须初始化,否则报错!
       
        (4)const char * const p
            这种是地址及指向对象都不能修改。


-------------------------------------------------------------   
十:static 用法
     1:static变量和static 函数各有什么特点?
        答:
            static变量:在程序运行期内一直有效,如果定义在函数
            外,则在编译单元内可见,如果在函数内,在在定义的block
            内可见;
            static函数:在编译单元内可见;
   
     
     
     
      
十一:文件部分
    1:当随机访问文件的时候,ftell函数返回???

十二:常见算法:
    1:在不用第三方参数的情况下,交换两个参数的值
    方法一:
    #include <stdio.h>  
    void main()
    {
        int i=60;
        int j=50;
        i=i+j;
        j=i-j;
        i=i-j;
        printf("i=%d\n",i);
        printf("j=%d\n",j);
    }
   
    方法二:
    i^=j;
    j^=i;
    i^=j;
   
    方法三:
    // 用加减实现,而且不会溢出
    a = a+b-(b=a)
   
十三:位域相关   
    位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位
    时, 位结构比按位运算符更加方便。
    位结构定义的一般形式为:
      struct位结构名{
        数据类型 变量名: 整型常数;
        数据类型 变量名: 整型常数;
       } 位结构变量;
    其中: 数据类型必须是int(unsigned或signed)。 整型常数必须
    是非负的整数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。
    变量名是选择项, 可以不命名, 这样规定是为了排列需要。
   
  例如: 下面定义了一个位结构。
  struct{
      unsigned incon:   8; /*incon  占用低字节的0~7共8位*/
      unsigned txcolor: 4; /*txcolor占用高字节的0~3位共4位*/
      unsigned bgcolor: 3; /*bgcolor占用高字节的4~6位共3位*/
      unsigned blink:   1; /*blink  占用高字节的第7位*/
  }ch;
  位结构成员的访问与结构成员的访问相同。
  例如: 访问上例位结构中的bgcolor成员可写成:
    ch.bgcolor

  注意:
  1. 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当
     成员长度为1时, 会被认为是unsigned类型。因为单个位不可能具
     有符号。
  2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组
     和指针, 如果是指针, 其成员访问方式同结构指针。
  3. 位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过
     两个字节。
  4. 位结构成员可以与其它结构成员一起使用。
  例如:
  struct info{
      char   name[8];
      int    age;
      struct addr address;
      float  pay;
      unsigned state: 1;
      unsigned pay  : 1;
      }workers;
  上例的结构定义了关于一个工人的信息。其中有两个位结构成员, 每
  个位结构成员只有一位, 因此只占一个字节但保存了两个信息, 该字
  节中第一位表示工人的状态, 第二位表示工资是否已发放。由此可见
  使用位结构可以节省存贮空间。
=============================================================
   1:如下的大小为??
        struct A
        {
            char t:4;
            char k:4;
            unsigned short i:8;
            unsigned long m;
        }
        sizeof(A)=?(不考虑边界对齐)
       
        7

十四:SIZEOF相关
    1:写出程序结果:
        void Func(char str[100])
        {
            printf("%d\n", sizeof(str));
        }

        答:
            4
        分析:
            指针长度

    2:int id[sizeof(unsigned long)];
        这个对吗?为什么??

        答:
            对
        这个 sizeof是编译时运算符,编译时就确定了
        可以看成和机器有关的常量。


十四:内存分配
   动态内存分配(Dynamic memory allocation) 尽管不像非嵌入
   式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配
   内存的过程的   。那么嵌入式系统中,动态分配内存可能发生的
   问题是什么?这里,我期望应试者能提到内存碎片,碎片收集的
   问题,变量的持行时间等等。
   让应试者进入一种虚假的安全感觉后,我拿出这么一个小节目:
   下面的代码片段的输出是什么,为什么?
         char *ptr;
         if ((ptr = (char *)malloc(0)) == NULL)
         {
             puts("Got a null pointer");
         }
         else
         {
             puts("Got a valid pointer");
         }
         这是一个有趣的问题。最近在我的一个同事不经意把0值
         传给了函数malloc,得到了一个合法的指针之后,我才想
         到这个问题。这就是上面的代码,该代码的输出是“Got a
         valid pointer”。我用这个来开始讨论这样的一问题,看
         看被面试者是否想到库例程这样做是正确。得到正确的答
         案固然重要,但解决问题的方法和你做决定的基本原理更
         重要些。

十五:综合部分

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值