define
在C语言中,#define 是一个预处理指令,用于创建宏定义(Macro Definition)。宏定义是一种文本替换机制,允许你在代码中使用标识符来代替一段文本。
const
在C 中,const 是一个关键字,用来修饰的内容不可变。
1. define
#define 的一般语法如下(了解即可):
1.定义常量 2.创建函数式宏 3.定义条件编译标志 4.字符串化宏 5.连接宏
1.1 定义常量
代码语言:javascript复制#define PI 3.14159265
这将创建一个名为 PI 的宏,它将在程序中代表 3.14159265。
1.2 创建函数式宏
代码语言:javascript复制#define SQUARE(x) ((x) * (x))
这将创建一个名为 SQUARE 的宏,它接受一个参数 x,并返回 x * x 的结果。比如可以在代码中使用 SQUARE(5) 来得到 5 的平方。
1.3 定义条件编译标志
代码语言:javascript复制#define DEBUG 1
这可以用于在编译时控制是否包含调试代码。例如可以在代码中使用 #ifdef DEBUG 来包含调试语句。
1.4 字符串化宏
代码语言:javascript复制#define STRINGIFY(x) #x
这将创建名为 STRINGIFY 的宏,可将标识符转换为字符串。例如STRINGIFY(Hello) 将被替换为 "Hello"。
1.5 连接宏
代码语言:javascript复制#define CONCAT(x, y) x##y
这将创建名为 CONCAT 的宏,可将两个标识符连接在一起。例如CONCAT(a, b) 将被替换为 ab。
2. const
以下是几种const
关键字的用法:
1. 定义常变量 2. 定义常量指针 3. 用来指向常量的指针 4. 定义常量成员函数 5. 定义常量引用参数 6. 定义常量对象
2.1 定义常变量
代码语言:javascript复制#include <iostream>
using namespace std;
int main()
{
const int Number=10; //定义常变量
//Number=20; 使用此语句则报错:assignment of read-only variable 'Number'
printf("%dn",Number); //输出10
return 0;
}
在这个例子中,Number
被声明为一个常变量,其值在声明后不可被修改。这可以用于创建不可变的数值或对象。
2.2 常量指针
代码语言:javascript复制int x = 5;
const int* ptr = &x;//*ptr 不变,ptr可变
*ptr = 6; //error
ptr=&b; //ok
b=66; //ok
这里,const int*
表示指向整数的常量指针。通过这种方式声明的指针,不能用于修改指向的值,但可以指向不同的整数。
2.3 指针常量
代码语言:javascript复制string str="hello";
int* const ptr = str;//指针常量,*ptr可变,ptr不变
*ptr='a'; //ok
ptr=str2; //error
在这个例子中,int* const
表示一个指向整数的指针常量,指向的整数可以被修改,但指针本身不可被重新赋值。
2.4 常量指针常量
代码语言:javascript复制const int* const ptr;//*ptr与ptr都不可变
*ptr=5; //error
ptr=&a; //error
2.5 定义常量成员函数
代码语言:javascript复制class MyClass {
public:
void SomeFunction() const {
// 不能修改成员变量
}
};
在类中,成员函数声明中的const
关键字表示该函数是一个常量成员函数,它不能修改类的成员变量(除非它们声明为mutable
)。
2.6 定义常量引用参数
代码语言:javascript复制void MyFunction(const int& value) {
// 不能修改传入的参数
}
函数参数前的const
关键字表示传入的参数是一个常量引用,函数内部不能修改这个参数的值。
2.7 定义常量对象
代码语言:javascript复制const MyClass obj;
在这个例子中,obj
是一个常量对象,意味着它的成员变量只能在构造函数中初始化,不能在对象创建后被修改。
3. 易错
1. const和define的区别
代码语言:javascript复制#define PI 3.14 //符号常量
const float PI=3.14; //常变量
const用于定义常量;而define用于定义宏,而宏也可以用于定义常量。都用于常量定义时,它们的区别有:
- const定义的常变量具有变量的基本属性,包括数据类型和存储单元,而#define无
- 有些编译器可以对const常变量进行调试,不能对宏调试
- 符号常量采用#define指令,属于预编译指令,在预编译后,符号常量就不存在了(比如符号常量PI全被置换成3.14)
那为什么有了const还需要#define呢? const无法代替宏作为卫哨来防止文件的重复包含
2. const int *a, int const *a, const int a, int *const a, const int *const a分别是什么,有什么特点
1. const int a; //a是常量,值不允许修改。 2. int const *a(等价const int *a); //a指针所指向的内存里的值不变,即(*a)不变,a可变 3. int *const a; //a指针所指向的内存地址不变,即(*a)可变,a不变 4. const int *const a; //都不变,即(*a)不变,a也不变
3. 简述常量指针和指针常量的区别
//const* 是常量指针,*const 是指针常量 int const *a; //a指针所指向的内存里的值不变,即(*a)不变 int *const a; //a指针所指向的内存地址不变,即a不变