• C面试题


    1、sizeof()和strlen()的使用?
    
    答:
    
        1.从功能定义上,strlen函数,用来求字符串的长度,sizeof函数是用来求指定变量或变量类型等所占用内存的
    
    
    
    大小;
    
        2.sizeof是运算符,而strlen是C库函数strlen仅仅能用char*做參数,且以'/0'结尾的;
    
      对于静态数组处理:
    
         char str[20]="0123456789";
    
         strlen(str)=10;   //表示数组中字符串的长度
    
         sizeof(str)=20;   //表示数组变量分配的长度
    
      对于指针处理:
    
         char *str="0123456789";
    
         strlen(str)=10;     //表示字符串的长度
    
         sizeof(str)=4;      //表示指针变量的所占内存大小
    
         sizeof(*str)=1;     //表示'0'这个字符变量的所占内存大小
    
    
    
    2、 struct 和 class的差别?
    
    答:
    
       (1)类中的成员默认是private的,当是能够声明为public,private 和protected,结构中定义的成员默认的都是
    
    
    
    public.
    
       (2)结构中不同意定义成员函数,当是类中能够定义成员函数.
    
       (3)结构不能够存在继承关系,当是类能够存在继承关系.
    
    3、 strcpy(), strcat(), strcmp,strlen(), strchr(), memcpy(), memcmp(), memset()的编写?
    
    
    
    4、 内存的分配方式的分配方式有几种?
    
    答:
    
       (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个执行期间都存在。比如
    
    
    
    全局变量。
    
       (2)在栈上创建。在运行函数时,函数内局部变量的存储单元都能够在栈上创建,函数运行结束时这些存储单元
    
    
    
    自己主动被释放。栈内存分配运算内置于处理器的指令集中,效率非常高,可是分配的内存容量有限。
    
       (3)从堆上分配,亦称动态内存分配。程序在执行的时候用malloc或new申请随意多少的内存,程序猿自己负责在
    
    
    
    何时用free或delete释放内存。动态内存的生存期由我们决定,使用很灵活,但问题也最多。
    
    
    
    5,、解释堆和栈的差别?
    
    答:
    
       (1)栈区(stack):由编译器自己主动分配释放 ,存放函数的參数值,局部变量的值等。其操作方式相似于数据结构中
    
    
    
    的栈。
    
       (2)堆区(heap):一般由程序猿分配释放, 若程序猿不释放,程序结束时可能由OS回收 。注意它与数据结构中的
    
    
    
    堆是两回事,分配方式倒是相似于链表.(主要有:malloc/free,new/delete)
    
    
    
    6,、枚举的使用方法,以及它与宏的差别?
    
    答:
    
        枚举(enum)作用:定义一组常量,并且这些常量组成了一个集合。当我们将emun參数传递给函数时,假设传递了
    
    
    
    一个不属于这个集合的參数,编译器报错。
    
        差别:
    
        枚举是类型,而宏没有类型。
    
        枚举将检查其语法,而宏是简单的文本替换。
    
    
    
    7、 const的使用方法,以及声明const变量与宏的差别?
    
    答:
    
       const的使用方法有四种:
    
       a): const对象和const类型的对象;
    
       b): const指针 和 指向const的指针 及两者结合;
    
       c): const 參数修饰 和 參数返回类型的const修饰;
    
       d): const类成员 和 const 成员函数;
    
       差别:
    
       const常量有数据类型, 而宏常量没有数据类型。编译器能够对前者进行类型安全检查,而对后者仅仅能进行字符
    
    
    
    替换,没有类型
    
       安全检查。并且字符替换可能会带来料想不到的边界效应。
    
       有些集成化工具能够对const常量进行调试, 但不能对宏量进行调试。
    
    
    
    8、函数assert的使用方法?
    
    答:
    
       断言assert是仅在debug版本号起作用的宏,用于检查“不应该“发生的情况。程序猿能够把assert看成一个在任
    
    
    
    何系统状态下都能够安全使用的无害測试手段。
    
    
    
    9、用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)?
    
    答:
    
       #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
    
    
    
    10、 写一个"标准"宏MIN,这个宏输入两个參数并返回较小的一个?
    
    答:
    
       #define MIN(A,B) ((A) <= (B) ? (A) : (B)) 
    
    
    
    11、嵌入式系统中常常要用到无限循环,你怎么样用C编写死循环呢?
    
    答:
    
       这个问题用几个解决方式。我首选的方案是:
    
       while(1)
    
       {
    
       }
    
    
    
       一些程序猿更喜欢例如以下方案:
    
       for(;;)
    
       {
    
       }
    
    
    
    12、用变量a给出以下的定义
    
    a) 一个整型数(An integer) 
    
    答:a)     int a; // An integer 
    
    b)一个指向整型数的指针( A pointer to an integer) 
    
    答:b)     int *a; // A pointer to an integer 
    
    c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)
    
    答:c)     int **a; // A pointer to a pointer to an integer 
    
    d)一个有10个整型数的数组( An array of 10 integers) 
    
    答:d)     int a[10]; // An array of 10 integers 
    
    e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers) 
    
    答:e)     int *a[10]; // An array of 10 pointers to integers 
    
    f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers) 
    
    答: f)     int (*a)[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) 
    
    答:g)    int (*a)(int); // A pointer to a function a that takes an integer argument and returns an 
    
    
    
    integer 
    
    h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型參数并返回一个整型数( An array of ten 
    
    
    
    pointers to functions that take an integer argument and return an integer )
    
    答:h)    int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument 
    
    
    
    and return an integer 
    
    
    
    13、关于内存对齐的问题以及sizof()的输出? 
    
    答:
    
       编译器自己主动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于
    
    
    
    ,为了訪问未对齐的内存,处理器须要作两次内存訪问;然而,对齐的内存訪问仅须要一次訪问。
    
    
    
    14、 static有什么用途?(请至少说明两种)
    
    答:
    
       (1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
    
       (2) 在模块内(但在函数体外),一个被声明为静态的变量能够被模块内所用函数訪问,但不能被模块外其他函数
    
    
    
    訪问。它是一个本地的全局变量。
    
       (3) 在模块内,一个被声明为静态的函数仅仅可被这一模块内的其他函数调用。那就是,这个函数被限制在声明它
    
    
    
    的模块的本地范围内使用。
    
    
    
    15、引用与指针有什么差别?
    
    答:
    
       (1) 引用必须被初始化,指针不必。
    
       (2) 引用初始化以后不能被改变,指针能够改变所指的对象。
    
       (3) 不存在指向空值的引用,可是存在指向空值的指针。
    
    
    
    16、什么是平衡二叉树?
    
    答:
    
       左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。
    
    
    
    17、堆栈溢出通常是由什么原因导致的?
    
    答:
    
       没有回收垃圾资源。
    
    
    
    18、什么是预编译?何时须要预编译?
    
    答:
    
       (1)总是使用不常常修改的大型代码体。 
    
       (2)程序由多个模块组成,全部模块都使用一组标准的包括文件和同样的编译选项。在这样的情况下,能够将全部
    
    
    
    包括文件预编译为一个预编译头。
    
    
    
    19、队列和栈有什么差别?
    
    答: 
    
       队列先进先出;栈后进先出。
    
    
    
    20、数组和链表的差别?
    
    答:
    
       数组:数据顺序存储,固定大小;
    
       链表:数据能够随机存储,大小可动态改变;
    
    
    
    21、为什么数组名作为參数,会改变数组的内容,而其他类型如int却不会改变变量的值?
    
    答:
    
       当数组名作为參数时,传递的实际上是地址。而其它类型如int作为參数时,因为函数參数值实质上是实參的一
    
    
    
    份拷贝,被调函数内部对形參的改变并不影响实參的值。
    
    
    
    22、数据结构和算法: 
    
    A:查找:
    
    (1)二分法查找;
    
    (2)
    
    (3)
    
    (4)
    
    B:写出下列算法的时间复杂度和实现排序:
    
    (1)冒泡排序; 
    
    (2)选择排序; 
    
    (3)插入排序; 
    
    (4)高速排序; 
    
    (5)堆排序; 
    
    (6)归并排序;
    
    
    
    23、编写gbk_strlen函数,计算含有汉字的字符串的长度,汉字作为一个字符处理;已知:汉字编码为双字节,当中
    
    
    
    首字节<0,尾字节在0~63以外;(假设一个字节是-128~127)?
    
    
    
    
  • 相关阅读:
    Clojure新手入门
    背包问题——第一篇
    矩阵快速幂的最简单用法
    加密的病历单
    JAVA NIO学习四:Path&Paths&Files 学习
    JAVA NIO学习三:NIO 的非阻塞式网络通信
    JAVA NIO学习二:通道(Channel)与缓冲区(Buffer)
    JAVA NIO学习一:NIO简介、NIO&IO的主要区别
    JAVA IO分析三:IO总结&文件分割与合并实例
    JAVA IO分析二:字节数组流、基本数据&对象类型的数据流、打印流
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4233414.html
Copyright © 2020-2023  润新知