C语言面试题整理

1.什么是预编译?

        预编译又称预处理,是整个编译最先做的工作,及程序执行前的一些预处理工作

        主要处理开头的指令,如拷贝  #include包含的文件代码、替换 #define定义的宏、条件编译等

        何时需要预编译? 总是使用并不经常改动的大型代码体

2. # 和 ## 的作用?

        #是宏参数 字符串替换运算符,## 是把两个 宏参数 连接起来的运算符

        #define   STR(arg)        #arg        //STR(hello)     ---> hello 

        #define  NAME(x,y)       x##y        //NAME(1,2)    ---->12

3.static 的用法

        修饰局部变量,该变量(栈区)变成静态存储类型,该变量存在于内存的静态区,作用域不变。

        修饰全局变量,该变量的作用域,只能在该文件中使用,不能在其他文件中通过extern引用。

        修饰函数,        静态函数只能在申明它的源文件中使用

4. extern 关键字的作用

        用来修饰变量或函数,表明该变量或函数都是在别的文件中定义的,提醒编译器在其他文件中寻找定义

5. sizeof 的用法

        计算对象或类型所占的内存字节数

        sizeof 求得的结构体(及其对象)的大小,不等于各个数据成员大小之和(地址对齐问题)

sizeof运算符 和函数strlen的区别与用法

        sizeof()计算分配空间的字节数

        strlen()计算空间中的字符个数(不包括'\0')

        char str[20] = {"hello world"};

        int   a[10];

        sizeof(str);      //20              sizeof(a);     //4*10        strlen(str);        //11

6.结构体的赋值

        C语言中对结构体变量的赋值,在初始化或者在定义后按字段赋值

        1. struct   dog{    char   a;  int   b;  }x  ={ 'a' ,2 };

        2.定义结构体变量         struct dog  x  ={ 'a' ,2 };

        3.按字段赋值

        struct  dog  x;    x.a='a';     x.b =2;

7.结构体变量如何比较?

        int  memcmp( const void *s1, const void *s2, size_t  n)        //n 为比较长度

        按字节来比较,如果超过数组长度n,比较不会停止'\0' 之后继续比较下去,可能会出错

        int strcmp ( const char * str1, const char * str2 );       按字符比较,直到出现结果

结构体成员数组大小为0,好处是可以在结构体中分配不定长的大小

typedef  struct  st{

        int   a;

        int   b;

        char c[0];        //空数组

} st_t;

        sizeof(st_t)  == 8; //即 c[0] ==0

8. malloc/free 与new/delete 的区别

        1.malloc/free 是C/C++语言的标准库函数,new/delete 是C++的运算符,都是动态分配和释放内存。2.主要区别就是 new/delete 对象在创建和释放的时候会执行构造函数和析构函数

9.C++里的类 和 C里面的 struct 区别

        C++   中的类具有成员保护功能,并且具有继承和多态的特点

        C里面没有成员函数,可以有函数指针,不能继承和派生,但可以结构体嵌套

10.主函数的写法

        int main(void)  {} 

        int  main( int argc, char  *args[] ){}

        argc  运行程序执行的参数个数 , 第一个是程序本身   xx.out

        args   指向字符串数组的指针   xx.out  ...

11.printf();

        int   a=10, b=20, c=30; 

        printf("%d  %d   %d\n",a+b+c, (b=b*2), (c=c*2) );  //  110  40  60   输出从右往左

        float   double 的输出   %.2f  --- 输出两位小数,会自动进行四舍五入

                     %8.2f --- 8是输出宽度,就是数据输出后在终端上占据8个 英文字母,不足的补空格

                float  a= 13.141592f;

                printf("%d\n", a );    //输出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值