C语言中const定义常量和宏常量的区别

    技术2025-12-20  11

    C语言中const定义常量和宏常量的区别

    1.const定义常量cons修饰指针时: 2.宏常量3.两者区别(1) 编译器处理方式不同(2) 类型和安全检查不同(3) 存储方式不同

    1.const定义常量

    关键字const 定义的是变量不是常量, 而是去改变一个变量的存储类,把该变量所占的内存变为只读。这就是变量的值不允许改变的常变量。该常量带有数据类型。编译运行的时候起作用存在类型检查。

    #include <stdio.h> const int a = 1; const static int b; void foo(int *p, int val) { *p = val; } int main() { const int c = 1; const static int d; printf("a = %d\n", a); foo((int *)&a, 3); printf("a= %d\n", a); printf("b = %d\n", b); foo((int *)&b, 3); printf("b = %d\n", b); printf("c = %d\n", c); foo((int *)&c, 3); printf("c = %d\n", c); printf("d = %d\n", d); foo((int *)&d, 3); printf("d = %d\n", d); return 0; }

    运行结果: a = 1 Segmentation fault (core dumped) 其中a是全局变量,b是静态全局变量,c是局部变量,d是静态局部变量。

    【特别地】 静态存储区分为DATA段和BSS段。 BSS段存放的是未初始化的普通全局变量、静态局部变量、静态全局变量, DATA段存放的是已初始化的普通全局变量、静态局部变量、静态全局变量,其中DATA段又分为只读段和可读可写段。

    现代编译器中关键字const修饰的全局变量、静态局部变量变量和静态全局变量就是存放在DATA段中的只读段,所以这些变量为只读属性,其值通过指针也不可改变。而const修饰的局部变量存放在栈中,可以通过指针改变其值。

    【注意】:字符串常量就是存储在DATA段的只读段,不能通过指针改变其值。

    cons修饰指针时:

    const int p; //p可变,p指向的内容不可变 int const p; //p可变,p指向的内容不可变 int * const p; //p不可变,p指向的内容可变 cons int* cons p;//p不可变,p指向的内容不可变

    注: 当const出现在 *号左边的时候,指针指向的数据不可改变,但是指针本身的值可以改变; 当const出现在 *号右边的时候,指针本身不能改变但是它指向的数据可以改变

    2.宏常量

    预处理器#define 定义的是不带数据类型的常数,只进行简单的字符替换。 在预编译的时候起作用,不存在类型检查。 #define 是宏定义,它不能定义常量,但宏定义可以实现在字面意义上和其它定义常量相同的功能。

    3.两者区别

    (1) 编译器处理方式不同

    #define 宏是在预处理阶段展开。 const 常量是编译运行阶段使用。

    (2) 类型和安全检查不同

    #define 宏没有类型,不做任何类型检查,仅仅是展开。 const 常量有具体的类型,在编译阶段会执行类型检查。

    (3) 存储方式不同

    #define 宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。(宏定义不分配内存,变量定义分配内存。) const定义常量会分配内存。

    Processed: 0.017, SQL: 9