- 宏定义
- 关键字
define
- 定义一个常量的方法(即宏定义)
// 常量的定义方法:(注意语句后面没有分号)
// #define 常量名 常量值
#define PI 3.1415926
- 带参数的宏定义
#define N(n) n*10
int b = N(10);//此处经过预编译之后的结果为 int b = 10*10;
- 宏函数的定义
//一般的写法
int add(int a, int b) {
return a + b;
}
int main() {
int a = 10;
int b = 100;
int result = add(a, b);
return 0;
}
//
//使用宏函数的写法
#define ADD(a, b) (a+b)
int main() {
int a = 10;
int b = 100;
int result = ADD(a, b);
//
int result2 = ADD(a, b) * ADD(a, b);
// 此处预编译之后的结果为:
// int result2 = (10 + 100) * (10 + 100);
//
// 假设宏函数写成 #define ADD(a, b) a+b
// 则编译后的结果为:
// int result2 = 10 + 100 * 10 + 100;//结果就错了,没有达到想要的结果
return 0;
}
- 使用宏函数的好处是,不需要为参数
a
和参数b
提供返回值类型,同时也不需要为函数提供返回值类型;- 宏定义不论写在哪里,都是全部的,即如果把宏定义写在add函数中,在mian函数中依然可以使用(注意:这里要区分
typedef
,typedef
是有作用域的)
- 结构体
- 关键字
struct
- 创建一个结构体
//创建一个结构体类型
struct Coor{
int x;
int y;
};
- 声明一个结构体变量
- 第一种方法
//声明一个结构体变量
struct Coor coor1;
2. 第二种
//创建一个结构体类型并声明一个全局的结构体变量
struct Coor{
int x;
int y;
}coor2;
3.第三种
//不指定结构体的名字
struct{
int x;
int y;
}coor2;
- 初始化一个结构体变量
//方法1:创建并初始化
struct Coor coor1 = {20, 30};
//
//方法2:
coor1.x = 20;
coor1.y = 30;
- 结构体数组
struct Coor coorArr[2] = {{10, 10}, {20, 20}};
- 结构体指针
struct Coor *c = &coor1; //创建一个结构体指针并赋值
int temp = (*c).x; //取出变量coor的x轴坐标
// 以上代码等同于
// int temp = c -> x; // -> 指向运算符
- 别名
- 关键字
typedef
- 用于给关键字起别名
typedef int tni; //注意这里有分号,以后就可以使用 tni 代替 int
typedef int *p; //以后就可以使用 p 代表int类型的指针了,即 int *
- 用于给结构体起别名
typedef struct {
int x;
int y;
} Coor;
共用体(联合体)
关键字
union
作用:让几个不同类型的变量共享同一个内存地址;
变量的存储类别
C语言根据变量的生存周期来划分,可以分为静态存储方式和动态存储方式。
- 静态存储方式:是指在程序运行期间分配固定的存储空间的方式。静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量。
- 动态存储方式:是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:函数形式参数;自动变量;函数调用时的现场保护和返回地址等。
- C语言中存储类别又分为四类:自动(auto,默认可省略)、静态(static)、寄存器的(register)和外部的(extern)
- 用关键字auto定义的变量为自动变量,auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。如:
int fn(int a){
auto int b,c;
... ...;
}
2. 用static修饰的为静态变量,如果定义在函数内部的,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量。
注意:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放;静态局部变量在编译时赋初值,即只赋初值一次;如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)
void fn() {
static int x = 0; //定义静态局部变量
x++;
printf("x=%d\n", x);
}
int main() {
for (int i = 0; i < 10; i++) {
fn();
}
return 0;
}
输出结果为:
如果去掉static关键字,则输出结果为:
3. 为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。
4. 用extern声明的的变量是外部变量,外部变量的意义是某函数可以调用在该函数之后定义的变量。
int main() {
extern int x;
cout<<x<<endl;
return 0;
}
int x =100;
//输出结果为100;