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 ); //输出