C语⾔中const定义常量和宏常量的区别
C语⾔中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);
return0;
}
运⾏结果:
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 宏没有类型,不做任何类型检查,仅仅是展开。
c语言和c++区别
const 常量有具体的类型,在编译阶段会执⾏类型检查。
(3) 存储⽅式不同
#define 宏仅仅是展开,有多少地⽅使⽤,就展开多少次,不会分配内存。(宏定义不分配内存,变量定义分配内存。)const定义常量会分配内存。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。