在C语言中const常用来定义常量,表示这个常量是不可以被修改的。define宏定义也可以用来表示一个常量。那么他们有那些区别呢!
1、预编译指令只是对值进行简单的替换,不能进行类型检查
2、可以保护被修饰的东西,防止意外修改,增强程序的健壮性
3、编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
1、const修饰局部变量
const int a=1;
int const a=1;
这两种写法是一样的,不过要注意const声明变量后这个变量就不能够在改变,那么在声明的时候就需要进行初始化,否则后面就无法进行修改了。
const char *p ="zxcvbnm";
如果没有用const修饰的话
如果对字符串进行修改,这肯定是有错的。但是编译没有报错,这是不是十分的危险!!!下面我们用const进行修饰
可以看到编译都过不了,在编译环节就检测出了错误。大大提高了程序的安全性。
3、常量指针和指针常量
int b=1;
const int * a = &b; //常量指针
int * const a = &b; //指针常量
常量指针:
1、常量指针说的是不能通过这个指针改变变量的值,但是还是可以通过其他的引用来改变变量的值的。
#include
#include
int main()
{
int b=2;
const int* a=&b;
//*a=5;这样写就是错误
printf("*a=%d\r\n",*a);
printf("a=%p\r\n",a);
b=3;
printf("*a=%d\r\n",*a);
printf("a=%p\r\n",a);
return 0;
}
运行结果:
*a=2
a=0061fef8
*a=3
a=0061fef8
2、常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址。
#include
#include
int main()
{
int b=2;
int c=4;
const int* a=&b;
printf("&b=%p\r\n",&b);
printf("a=%p\r\n",a);
a=&c;
printf("*a=%d\r\n",*a);
printf("a=%p\r\n",a);
b=3;
printf("*a=%d\r\n",*a);
printf("a=%p\r\n",a);
return 0;
}
运行结果:
&b=0061fef8
a=0061fef8
*a=4
a=0061fef4
*a=4
a=0061fef4
指针常量:指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向改地址的指针来修改
#include
#include
int main()
{
int b=2;
int *c=&b;
int* const a=&b;
printf("&b=%p\r\n",&b);
printf("c=%p\r\n",c);
printf("*c=%d\r\n",*c);
printf("a=%p\r\n",a);
printf("*a=%d\r\n",*a);
printf("\r\n");
*c=6;
printf("c=%p\r\n",c);
printf("*c=%d\r\n",*c);
printf("a=%p\r\n",a);
printf("*a=%d\r\n",*a);
printf("\r\n");
b=3;
printf("c=%p\r\n",c);
printf("*c=%d\r\n",*c);
printf("a=%p\r\n",a);
printf("*a=%d\r\n",*a);
return 0;
}
运行结果:
&b=0061fef4
c=0061fef4
*c=2
a=0061fef4
*a=2
c=0061fef4
*c=6
a=0061fef4
*a=6
c=0061fef4
*c=3
a=0061fef4
*a=3
4、const修饰函数的参数
这点作用就和常量指针,和指针常量一样。
#include
#include
void fun(const int * n)
{
int a=1;
n=&a;
printf("%d\r\n",*n);
a=3;
printf("%d\r\n",*n);
}
int main()
{
int b=2;
fun(&b);
return 0;
}
运行结果:
1
3
指针常量那种写法就不用再写了吧。
5、const修饰函数返回值
这个我测试,实在没有找到错误示例,咋都行。
#include
#include
const char * fun(void)
{
char *p="zxcvbnm";
return p;
}
int main()
{
char *b=fun();
printf("%s\r\n",b);
return 0;
}
运行无错。
6、const修饰全局变量。
比普通全局变优点是,不可更改。更安全。