纯C语言开发面试经验

1.“预编译”的书写

预编译是什么:预编译就是在编译开始之前对#开头的代码做文本替换工作,包括展开头文件/宏替换/去掉注释/条件编译
源代码

#include<stdio.h>
#define add(a,b)  a+b

int main(){
	int a = 10,b=20;
	int z = add(a,b);
	printf("%d",z);
	return 0;
} 

gcc使用教程:
https://blog.csdn.net/qq_42475711/article/details/85224010
在cmd中用gcc -E program.cpp指令进行预编译以后的结果:

可以看到main里面的第二行的的add被替换了
写法1(宏定义一个函数):
#define 空格 函数名和参数 空格 函数内容(没有大括号)

写法2(宏定义一个变量):
#define 空格 变量名 空格 值

写法3(路径替换):
如下,用ENG_PATH_1 代表C:\Program Files (x86)这个路径

#define ENG_PATH_1 C:\Program Files (x86)

写法4(条件编译):

#ifdef 某某某
代码...
代码...
#endif

含义:如果在开头声明即#define了某某某,中间的代码就会运行

2.static的作用

2.1在面向过程中

静态局部变量变成了全局变量

静态全局变量不可以被其他文件调用

静态函数不可以被其他文件调用

2.2在面向对象中

可以直接通过类名.方法或者变量名的方式调用,不必声明对象

3.**是什么

指向指针的指针,套娃

4.定义指针

int* p; //中间有空格,p是int*变量

错误写法:

int* p = 10;

正确写法:

int* p = NULL; //必须初始化

*p = 10; //这里的星号的作用就是取P里面的值

5.逻辑运算符与位运算(容易搞混)

逻辑运算符 && 、||、!

位运算 &、|、^ 、~

按位与、按位或、异或

<< 左移 相当于乘二,效率高

>> 右移 相当于除二,效率高

6.将某一位变为0 或者将某一位变为1

原理:

任何值&1后 值不变。 任何值&0后 值为0

变为0:

a=0x95(1001 0101)
假设清除第五位:
a &= ~0x10 ;
10010101 &11101111(~00010000)
=10000101(0x85)

变为1:

直接用或就可以了
如何将10101的第从左往右数的第2位变1
代码10101|(1<<3)

6.区分给结构体取别名和定义结构体变量

7.函数指针是什么?

#include<stdio.h>
//定义个add函数,功能是相加 
int add(int x,int y){
	return x+y;
}
//定义个substraction函数,功能是相减少 
int substraction(int x,int y){
	return x-y;
}

//定义一个函数指针,注意int *p(int x,int y) 表示的是返回类型是指针的函数 
int (*p)(int x,int y);

int main(){
	//让p指向add函数 
	p = add;
	//输出p(1,2)的结果 
	printf("%d\n",p(1,2));
	
	//让p指向substraction函数 
	p = substraction;
	//输出p(1,2)的结果 
	printf("%d\n",p(1,2));
	
	return 0;
} 

输出结果为

8.C语言里面的钩子(hook)是什么?

浅谈c++ hook 钩子的使用介绍,来源:脚本之家,作者:DoubleLi

posted @ 2021-12-16 20:58  猪猪猪猪侠  阅读(117)  评论(0编辑  收藏  举报