【经验贴】C语言知识点汇总

前言

汇总贴:【回馈牛客】双非二本嵌入式秋招之路总结

在这部分分享里面,我只会涉及各部分的考点,但是不会把答案放出来,有一些我遇到的感觉不错的题也会放上来。这么做一方面是我自己也没法保证自己的答案是完全正确的(之前就有过看一个面经,然后里面的答案是错误的,在面试的时候吃过亏);另一方面是希望大家能够自己去查找,在理解的基础上记忆才能记得更牢,而且能对整个原理有一个认知,而不是完完全全靠背答案,这样效果很差,而且经不起面试官深入地问。这里把大部分的要点都总结出来了,就算一点一点去查资料也能在一周左右的时间内复习完。对于过于基础的知识就不提了,只提一些比较不容易注意到的点和比较重要的点。这里提到的知识点都是考察率非常高的,希望大家能把这些知识点弄懂,于此同时也要不断去看其他人的笔经面经,从里面找到自己不会的知识点,不断丰富自己的知识库。

运算符

  1. 运算符的优先级要熟悉
  • 逗号运算符最后的结果是最后一位,如
x =(a=2,b=3,a+b)
结果为5
  • a++=b++;是不可以的
  • ++a=++b;是可以的
a=5,b=10;
a=b++;
printf("%d,%d", a, b); 
//结果是10,11
  • a++的具体运算过程为
int temp=a; 
a=a+1;
return temp;
  • ++a的具体运算过程为
a=a+1;
return a;
  • 后置自增运算符需要把原来变量的值复制到一个临时的存储空间,等运算结束后才会返回这个临时变量的值。所以前置自增运算符效率比后置高。

输入输出

  1. scanf和gets的区别?
  2. 怎么用scanf接收i个数据?
  3. 抑制符’*’?
  • printf是从右向左的,例:
int arr[] = { 11,12,13,14,15 };
int *ptr = arr;
*(ptr++) += 100; 
printf("%d %d", *ptr, *(++ptr)); 
//输出13 13
  • printf的特殊用法
char str[]="hello";
printf(str);

原码、反码、补码

要知道原码反码补码的关系,会已知一个正数求他的反码、补码;已知一个负数求他的反码、补码就可以了。

预处理

  1. 程序的编译过程分几个部分?
  2. 宏定义是在编译的哪个阶段被处理的?
  3. 怎么用预处理指令 #define 声明一个常数 ,用以表明 1 年中有多少秒(忽略闰年问题)?
  4. 预处理标识#error的目的是什么?

关键字

static

  1. 关键字 static 的作用是什么?

const

  1. 如何定义一个指向整型常量的指针变量?
  2. 如何定义一个指向整型变量的指针常量?
  3. const常量和#define的区别是什么?

volatile

  1. 关键字 volatile 的作用是什么?
  2. 一般在什么情况下使用volatile?

extern

  1. 关键字extern的作用是什么?
  2. extern"C"的作用是什么?
  3. C语言编译过程中,关键字volatile和extern分别在哪个阶段起作用?

sizeof

  1. sizeof关键字的作用是什么?
  2. 不使用sizeof()函数,怎么求数据类型所占字节数?
  3. sizeof和strlen的区别是什么?

typedef

  1. 以下两种情况的意图都是要定义 dPS 和 tPS 作为一个指向结构体 s 的指针。哪种方法更好呢?为什么?
#define  dPS  struct s *  
typedef  struct s *  tPS;  

2.typedef和#define有什么区别?

auto

  1. 关键字auto的作用是什么?

register

  1. 关键字register的作用是什么?
  2. 使用时需要注意什么?

堆栈

  1. 堆和栈有什么区别?
  2. 堆和栈的存储效率,哪个更快?
  3. 堆栈溢出的原因有哪些?
  4. 队列和栈的区别?
  5. 为什么堆的空间不连续?
  6. 为什么局部变量在栈里不在堆里?
  7. C语言函数参数压栈的顺序是怎么样的?
  • 对于栈中内存如果没有初始化,则会出现“烫烫烫烫烫烫”。对于堆中内存如果没有初始化,则会出现“屯屯屯屯屯”

指针

  1. 指针的大小是多大?
  2. 指针与数组名的区别是什么?
  3. 什么是指针数组?
  4. 什么是数组指针?
  5. 怎么用指针数组表示二维数组?
  6. 怎么用数组指针表示二维数组?
  7. 可变长数组怎么实现?
  8. 什么是函数指针?
  9. 函数指针有什么作用?
  10. 什么是指针函数?
  11. 什么是野指针?
  12. 如何避免野指针?
  13. 引用与指针的区别?
  • 局部变量在堆中创建,函数返回后局部变量会被释放,所以不能返回局部变量的地址,局部变量在释放后会丢失(特别经典)

函数

  1. 函数返回过程是怎么样的?
  2. 函数A调用函数B的调用过程是怎么样的?
  3. 什么是回调函数?
  4. 为什么要使用回调函数?
  5. 什么是可重入函数?
  6. 可重入函数有什么特点及注意事项?
  7. 如何实现一个函数在main函数之前执行?
  • C中:如果函数未指定返回值类型,则默认为int

字符串

  1. strcmp函数复现
  2. strstr函数复现
  3. strcpy函数复现

结构体、联合体

  1. 怎么计算一个结构体大小?
  2. 怎么根据结构体成员地址反推结构体首地址?
  3. 结构体和联合体的区别?
  • 16位机器下不考虑字节对齐

程序内存分配

  1. 程序运行的时候,内存中有多少个区?
  2. 什么是内存泄漏?

malloc

  1. new和malloc的区别?
  2. calloc和malloc的区别?
  3. 在1G内存的计算机中能否malloc(1.2G)?为什么?

大小端

  1. 什么是大端存储?什么是小端存储?
  2. 判断大小端(一种指针方法,一种联合体方法)
  3. 如何进行大小端的转换?

其他

  1. 不定义新的变量,怎么直接交换两个变量的值?(加减方法和异或方法)

  2. 如何计算二进制中1的个数?(平行算法)

  3. 每种数据类型的大小?

  4. 定义以下变量:

    1. 一个整型数;
    2. 一个指向整型数的指针;
    3. 一个指向指针的指针,它指向的指针是指向一个整型数;
    4. 一个有10个整型的数组;
    5. 一个有10个指针的数组,该指针是指向一个整型数;
    6. 一个指向有10个整型数数组的指针;
    7. 一个指向函数的指针,该函数有一个整型参数并返回一个整型数;
    8. 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
  5. 变量作用域有哪些?

  6. 浮点数怎么判断相等?

  7. 如何用C语言实现读写寄存器变量?

  8. 数组下标可以为负数吗?

  9. 什么是字节对齐,为什么要对齐?

  10. 已知数组table,用宏求数组元素个数。

  11. 带参宏和函数的区别?

  12. 内联函数的优缺点和适用场景是什么?

  13. 全局变量和局部变量的区别?

  14. 全局变量可不可以定义在可被多个.c文件包含的头文件中

  15. float型数据是怎么存储的?

  16. 什么是左值,什么是右值?

  • x=x&(x-1),用于计算x的二进制中1的个数,也可以判断一个数是不是2的n次方
  • 初始化指针时所创建的字符串常量被定义为只读,如果试图修改这个字符串的值,程序就会出现未定义的行为
  • 数组作为函数的参数时会退化成指针

在这些知识点都掌握的情况下,大家可以在牛客网刷刷C语言的题,对于掌握这些知识及应用这些知识有很大的帮助。

#高频知识点汇总##春招##面经##笔经##学习路径##校招##嵌入式工程师#
全部评论
🎉恭喜牛友成功参与 【创作激励计划】高频知识点汇总专场,并通过审核! ------------------- 创作激励计划5大主题专场等你来写,最高可领取500元京东卡和500元实物奖品! 👉快来参加吧:https://www.nowcoder.com/discuss/804743
点赞
送花
回复
分享
发布于 2021-11-26 12:15

相关推荐

37 224 评论
分享
牛客网
牛客企业服务