const与define区别

在C语言中const常用来定义常量,表示这个常量是不可以被修改的。define宏定义也可以用来表示一个常量。那么他们有那些区别呢!

1、预编译指令只是对值进行简单的替换,不能进行类型检查

2、可以保护被修饰的东西,防止意外修改,增强程序的健壮性

3、编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

const作用

1、const修饰局部变量

const int a=1;
int const a=1;

这两种写法是一样的,不过要注意const声明变量后这个变量就不能够在改变,那么在声明的时候就需要进行初始化,否则后面就无法进行修改了。

示例:
C语言const用法详解(带实例)_c语言
2、修饰常量字符串

const char *p ="zxcvbnm";

如果没有用const修饰的话
C语言const用法详解(带实例)_指针常量_02
如果对字符串进行修改,这肯定是有错的。但是编译没有报错,这是不是十分的危险!!!下面我们用const进行修饰
C语言const用法详解(带实例)_const_03
可以看到编译都过不了,在编译环节就检测出了错误。大大提高了程序的安全性。
3、常量指针和指针常量

int b=1;
const int * a = &b;  //常量指针
int * const a = &b;  //指针常量

常量指针:
1、常量指针说的是不能通过这个指针改变变量的值,但是还是可以通过其他的引用来改变变量的值的。

#include <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdlib.h>
const char * fun(void)
{
    char *p="zxcvbnm";
    return p;

}
int main()
{
    char *b=fun();

    printf("%s\r\n",b);
    return 0;
}

运行无错。
6、const修饰全局变量。
比普通全局变优点是,不可更改。更安全。