const与define区别
在C语言中const常用来定义常量,表示这个常量是不可以被修改的。define宏定义也可以用来表示一个常量。那么他们有那些区别呢!
1、预编译指令只是对值进行简单的替换,不能进行类型检查
2、可以保护被修饰的东西,防止意外修改,增强程序的健壮性
3、编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
const作用
1、const修饰局部变量
const int a=1; int const a=1;
这两种写法是一样的,不过要注意const声明变量后这个变量就不能够在改变,那么在声明的时候就需要进行初始化,否则后面就无法进行修改了。
const char *p ="zxcvbnm";
int b=1; const int * a = &b; //常量指针 int * const a = &b; //指针常量
#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; }
运行结果:
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; }
运行结果:
指针常量:指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向改地址的指针来修改
#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; }
运行结果:
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; }
运行结果:
#include
#include
const char * fun(void) {
char *p="zxcvbnm"; return p; } int main() {
char *b=fun(); printf("%s\r\n",b); return 0; }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203284.html原文链接:https://javaforall.net
