C语言宏中“#”和“##”的用法:
1、“#“用法——字符串化宏定义输入参数
作用:当使用“#”修饰宏定义输入参数时,其本质就是将这个参数转化为字符串形式,且该修饰符必须在参数名之前。
如:
使用范例:
#define demo(input) #input
当使用上述宏定义时 ,如:demo(123)可以认为其返回一个字符串“123”,即将一个整数123转换成了字符串“123”,因此可以有如下使用:
String str = demo(123); //String str = "123";
2、“##”用法——将宏定义的输入参数与其他字符组合成一个其他参数。
作用:这种方式就像是变量组合,但是组合后的变量必须是已经定义过的变量,且“##”的前后空格没有实际意义。
使用范例:
#define SUM(a,b) sum(a##1,b) //a##1与a ## 1意义相同
int a,a1,b,c;
int main(void)
{
c = SUM(a,b); //本质是c = sum(a1,b);
}
结合变量名在程序编译阶段的作用,博主猜想这种使用方法的本质是在代码编译阶段,编译器识别到“##”时会将前后两个字符组合成新的变量名,并且找到这个新的变量名的存储空间,并用这个存储空间的地址去替换这个组合参数名。
需要注意的是,如果两个组合的参数本身是一个宏的话,“##”会限制其展开,如下示例:
#define SUM(a,b) sum(a##1,b)
SUM(SUM(a,b),b) //这个表达式并不会转为sum(sum(a1,b),b),而是会变成sum(SUM(a,b)1, b)
C语言Static关键字的用法:(诺瓦、影石、大华)
偷个小懒,自己之前整理过这个,博客链接如下:
C语言-static的用法_static在c语言中的用法-优快云博客
1.static是什么
static在C语言中是关键字,中文直译过来是“静态的”,static关键字在C语言中主要是用来修饰变量和函数。
static有三种不同的用法:
1.修饰局部变量;
2.修饰全局变量;
3.修饰函数
局部变量:当函数第一被调用,函数中的静态局部变量被初始化,再次调用这个函数,这个 static 变量也不会再次被初始化,仍是保存的前一次函数调用时的结果。 (作用域不变,生存期改变)
全局变量: static 说明的全局变量只可以在当前 c 程序文件中使用(作用域收到限制,生存期不变)。
函数: static说明的函数只可以在当前 c 程序文件中使用 (作用域收到限制,生存期不变)。
内存大致上被划分为三个区域:栈区,堆区,静态区。

C语言-外部关键字extern :
自己之前整理过这个,博客链接如下:
extern 用在全局变量或函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用。
什么是定义:所谓的定义就是为这个变量分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名。
什么是声明: 有两重含义,如下:
第一重含义: 告诉编译器,这个名字已经匹配到一块内存上了。
第二重含义: 告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量名。记住,
定义和声明最重要的区别: 定义创建了对象并为这个对象一块内存,而声明的时候是没有分配内存空间的。
声明是不开辟内存的,定义是开辟内存的。
标准定义格式:extern 类型名 变量名;
extern int i; //是声明,不是定义,没有分配内存
int i; //是定义
4.16
C语言-new和malloc
C语言-Sizeof()和 strlen()的区别:
1.Sizeof()和 strlen()的区别
C语言关键字sizeof 与strlen-优快云博客



C语言-联合体 union 和结构体 struct 的区别:
对于联合体所有的成员都共享一块内存,而结构体是所有变量内存的叠加,需要考虑字节对齐问题,对于联合体来说,只要你修改里面的成员的数据就会修 改其他成员的数据,而结构体的成员数据是不影响的
C语言-++a和a++有什么区别?两者是如何实现的?
a++到底做了什么操作
a++是一组操作,它的过程是这样的(假设此时a的值为10):
- 获取到a的值,也就是10。
- 进行计算,也就是把获取到的值加一,得到计算后的结果,也就是11
- 把计算后的结果重新赋值给a,此时a为11
a++和++a的区别是什么
a++是进行上面讲的一组操作,这组操作执行完毕后返回之前取到的值,也就是10。
++a也是进行一组操作,只不过返回的是计算之后的值,也就是11。
使用技巧
可以把++看成一组操作,如果a写在++前,则表示返回计算前取到的值;如果a写在++后,则表示返回计算后的值。
C语言-Volatile(编译优化阶段)

C语言-Continue
C语言-Break
C语言-register
register的作用
如果一个变量用register来修饰,则意味着该变量会作为一个寄存器变量,让该变量的访问速度达到最快。例如,一个程序逻辑中有一个很大的循环,循环中有几个变量要频繁进行操作,这些变量可以声明为register类型。
C语言-Return
结束当前循环,退出函数,用在函数体中,返回特定值
C语言-Goto
无条件跳转
C语言-Struct(结构体) (C 和 C++区别,求结构体大小,使用的注意事项)
C语言之学习结构体_结构体类型的定义,结构体变量的定义和引用; 定义一个学生结构体类型, 包括整型的-优快云博客
C语言与c++中结构体之间的区别_c语言和c++结构体的区别-优快云博客
C语言-class 和 struct 的区别
C语言-class 和 struct 的区别

C语言-Typedef
C语言-typedef关键字_c语言常用关键字 typedef-优快云博客
typedef是在C语言允许为一个数据类型起一个新的别名。它本身是一种存储类的关键字,与auto extern,mutable、static、register 等关键字不能出现在同一个表达式中。
Typedef与define
在单片机和操作系统中 typedef 会经常用到,它可以为某一个类型自定义名称。和#define比较类似。但是又有不同的地方。
typedef 创建的符号只能用于数据类型,不能用于值。而#define 创建的符号可以用于值。
typedef 是由编译器来解释,而不是预处理器。
typedef 使用起来更加灵活。
Typedef是起别名,define是替换。
C语言-Extern(链接阶段)
C语言-Auto
C++11 auto类型推导_c11自动类型推导-优快云博客
C语言-变量的作用域(全局变量和局部变量)
C语言由四种地方可以定义变量
在函数外部定义的是全局变量(这里的函数包括main函数)
在头文件中定义的是全局变量
在函数或语句块内部定义的是局部变量
函数的参数是该函数的局部变量
全局变量,在定义位置之后的任意函数都能访问.
存储的区别
全局变量存储在一个程序的data段中的静态数据区
局部变量存储在一个程序的data段中的栈区(stack),我们每定义一个局部变量,栈就会分配一块空间用来存储我们定义的局部变量
作用域的区别
作用域是指程序中被定义的变量存在(或生效)的区域,超过该区域变量就不能访问
局部变量的作用域仅限于定义这个变量的函数内部,在一个函数内部定义了,就不能在其它函数内部使用这个变量
#include<stdio.h>
void swap()
{
int a = 10; //在swap函数内定义一个局部变量a
}
int main()
{
swap();
printf("%d", a);//在主函数内部是不能使用的
}
全局变量的作用域是整个源程序,也就是整个工程文件,也就是谁说,定义了一个全局变量,这个变量不仅可以在多个函数内部使用,还可以在同一工程中的其它文件中使用!!(这一点太重要了)
#include<stdio.h>
int a = 10; //定义一个全局变量a
void swap()
{
printf("%d", a);
}
int main()
{
swap();
printf("%d", a);//在主函数内部是不能使用的
}