C语言之旅(4)const

来源:互联网 发布:软件登记在哪里办理 编辑:程序博客网 时间:2024/06/05 20:36

在C语言中,const声明的变量是只读变量,并不等同于常量。

const和define的区别是什么?

1.对于define宏,在C语言中是单纯的替换。在预编译的是就会完成替换操作,并不检查对错。

2.而const,程序在编译的时候会检查const的类型,如果不对编译会报错。

3.const可以保护被修饰的东西,防止被意外或者恶意修改。例如函数中的传参数,如果用const修饰的话,在函数内部是不允许修改这个参数的数值的。

const int a;和int const a;效果是一样的,都是不允许在程序后续的执行过程中对变量a 的内容就行修改。所以说这个时候修饰的变量a应该尽量初始化,因为之后是不允许修改的。

int const *p;和int *const p;以及int const * const p;的区别?

1.const在*号的左边说明指针p存储的地址对应的内存空间里面的数值不能改变;

2.const在*号右边的话,说明p指针只能存储刚该是初始化的时候存储的地址,不能再次进行改变。

3.const在*的两侧都有的话就是上面两种情况同事发生。

例如:

int a=3;

int b=4;

int const *p1=&a;

这个时候p1存储的是变量a的地址,但是const实在*号左边的,(可以理解为,const修饰了p1的引用,即*p)那么*p1=4;(X)不对的。但是p1=&b;(正确)

int * const p2=&a;

这个时候p2存储的是变量a的地址,但是const实在*号右边的,(可以理解为,const修饰了指针变量p1)那么*p1=4;(正确)不对的。但是p1=&b;(不对)。这个时候p2只能存储初始化的时候赋值的a的地址。之后将不能改变。

int const a=6;

int arr[a];这个在C语言中是不正确的,因为ANSI C中规定,数组中括号中的必须是常量,而在C语言中const a;中的a是只读变量,并不是常量,所以是不对的,但是在C++中确实正确的。

是不是const定义的变量就真的不能改变了?

答案是否定的,例如:int const a =9;

尽管变量a的数值不能直接改变,但是我们可以定义一个指针存储a的地址,然后通过地址进行改变。

int *p=&a;

*p = 12;

这样a的数值就变成了12.


但是在C++中是不成立的。

原创粉丝点击