纯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;
}
输出结果为