【经验贴】C语言知识点汇总
前言
在这部分分享里面,我只会涉及各部分的考点,但是不会把答案放出来,有一些我遇到的感觉不错的题也会放上来。这么做一方面是我自己也没法保证自己的答案是完全正确的(之前就有过看一个面经,然后里面的答案是错误的,在面试的时候吃过亏);另一方面是希望大家能够自己去查找,在理解的基础上记忆才能记得更牢,而且能对整个原理有一个认知,而不是完完全全靠背答案,这样效果很差,而且经不起面试官深入地问。这里把大部分的要点都总结出来了,就算一点一点去查资料也能在一周左右的时间内复习完。对于过于基础的知识就不提了,只提一些比较不容易注意到的点和比较重要的点。这里提到的知识点都是考察率非常高的,希望大家能把这些知识点弄懂,于此同时也要不断去看其他人的笔经面经,从里面找到自己不会的知识点,不断丰富自己的知识库。
运算符
- 运算符的优先级要熟悉
- 逗号运算符最后的结果是最后一位,如
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;
- 后置自增运算符需要把原来变量的值复制到一个临时的存储空间,等运算结束后才会返回这个临时变量的值。所以前置自增运算符效率比后置高。
输入输出
- scanf和gets的区别?
- 怎么用scanf接收i个数据?
- 抑制符’*’?
- 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);
原码、反码、补码
要知道原码反码补码的关系,会已知一个正数求他的反码、补码;已知一个负数求他的反码、补码就可以了。
预处理
- 程序的编译过程分几个部分?
- 宏定义是在编译的哪个阶段被处理的?
- 怎么用预处理指令 #define 声明一个常数 ,用以表明 1 年中有多少秒(忽略闰年问题)?
- 预处理标识#error的目的是什么?
关键字
static
- 关键字 static 的作用是什么?
const
- 如何定义一个指向整型常量的指针变量?
- 如何定义一个指向整型变量的指针常量?
- const常量和#define的区别是什么?
volatile
- 关键字 volatile 的作用是什么?
- 一般在什么情况下使用volatile?
extern
- 关键字extern的作用是什么?
- extern"C"的作用是什么?
- C语言编译过程中,关键字volatile和extern分别在哪个阶段起作用?
sizeof
- sizeof关键字的作用是什么?
- 不使用sizeof()函数,怎么求数据类型所占字节数?
- sizeof和strlen的区别是什么?
typedef
- 以下两种情况的意图都是要定义 dPS 和 tPS 作为一个指向结构体 s 的指针。哪种方法更好呢?为什么?
#define dPS struct s * typedef struct s * tPS;
2.typedef和#define有什么区别?
auto
- 关键字auto的作用是什么?
register
- 关键字register的作用是什么?
- 使用时需要注意什么?
堆栈
- 堆和栈有什么区别?
- 堆和栈的存储效率,哪个更快?
- 堆栈溢出的原因有哪些?
- 队列和栈的区别?
- 为什么堆的空间不连续?
- 为什么局部变量在栈里不在堆里?
- C语言函数参数压栈的顺序是怎么样的?
- 对于栈中内存如果没有初始化,则会出现“烫烫烫烫烫烫”。对于堆中内存如果没有初始化,则会出现“屯屯屯屯屯”
指针
- 指针的大小是多大?
- 指针与数组名的区别是什么?
- 什么是指针数组?
- 什么是数组指针?
- 怎么用指针数组表示二维数组?
- 怎么用数组指针表示二维数组?
- 可变长数组怎么实现?
- 什么是函数指针?
- 函数指针有什么作用?
- 什么是指针函数?
- 什么是野指针?
- 如何避免野指针?
- 引用与指针的区别?
- 局部变量在堆中创建,函数返回后局部变量会被释放,所以不能返回局部变量的地址,局部变量在释放后会丢失(特别经典)
函数
- 函数返回过程是怎么样的?
- 函数A调用函数B的调用过程是怎么样的?
- 什么是回调函数?
- 为什么要使用回调函数?
- 什么是可重入函数?
- 可重入函数有什么特点及注意事项?
- 如何实现一个函数在main函数之前执行?
- C中:如果函数未指定返回值类型,则默认为int
字符串
- strcmp函数复现
- strstr函数复现
- strcpy函数复现
结构体、联合体
- 怎么计算一个结构体大小?
- 怎么根据结构体成员地址反推结构体首地址?
- 结构体和联合体的区别?
- 16位机器下不考虑字节对齐
程序内存分配
- 程序运行的时候,内存中有多少个区?
- 什么是内存泄漏?
malloc
- new和malloc的区别?
- calloc和malloc的区别?
- 在1G内存的计算机中能否malloc(1.2G)?为什么?
大小端
- 什么是大端存储?什么是小端存储?
- 判断大小端(一种指针方法,一种联合体方法)
- 如何进行大小端的转换?
其他
不定义新的变量,怎么直接交换两个变量的值?(加减方法和异或方法)
如何计算二进制中1的个数?(平行算法)
每种数据类型的大小?
定义以下变量:
- 一个整型数;
- 一个指向整型数的指针;
- 一个指向指针的指针,它指向的指针是指向一个整型数;
- 一个有10个整型的数组;
- 一个有10个指针的数组,该指针是指向一个整型数;
- 一个指向有10个整型数数组的指针;
- 一个指向函数的指针,该函数有一个整型参数并返回一个整型数;
- 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
变量作用域有哪些?
浮点数怎么判断相等?
如何用C语言实现读写寄存器变量?
数组下标可以为负数吗?
什么是字节对齐,为什么要对齐?
已知数组table,用宏求数组元素个数。
带参宏和函数的区别?
内联函数的优缺点和适用场景是什么?
全局变量和局部变量的区别?
全局变量可不可以定义在可被多个.c文件包含的头文件中
float型数据是怎么存储的?
什么是左值,什么是右值?
- x=x&(x-1),用于计算x的二进制中1的个数,也可以判断一个数是不是2的n次方
- 初始化指针时所创建的字符串常量被定义为只读,如果试图修改这个字符串的值,程序就会出现未定义的行为
- 数组作为函数的参数时会退化成指针
在这些知识点都掌握的情况下,大家可以在牛客网刷刷C语言的题,对于掌握这些知识及应用这些知识有很大的帮助。
#高频知识点汇总##春招##面经##笔经##学习路径##校招##嵌入式工程师#