关于const的基本认识
const的基本概念
const 是"constant"的缩写,意思是永恒不变的,它定义的是只读变量的关键字,或者说是定义常变量的关键字。
特点:
说const定义的是变量,但又相当于是常量。说它定义的是常量,但它又有变量的特点,所以作常变量。
1.用const定义的变量的值是不能在修改的。它定义的是只读变量,所以必须在定义的时候就要给它初始化。
int main() { int a = 20; a = 30;//局部变量是可以修改的 // int const b=10;const写在int左边和右边都是可以的。都是修饰b const int b = 10; (错误)b = 15;//被const修饰的b无法再修改,初始化后就不能修改了 return 0; }
2.用const修饰的变量,无论是全局变量话说局部变量,生命周期都是程序运行的整个过程。全局变量的生命周期是整个过程而用const修饰过后的变量因为拥有了静态特性,它的生命周期也是程序运行的整个过程。但是注意用const修饰的局部变量只是有了静态特性,并没有说它变成了静态变量。
注意点:
1.我们知道,局部变量存储在栈中,静态变量存储在静态存储区中,而经过 const 修饰过的变量存储在内存中的“只读数据段”中。只读数据段中存放着常量和只读变量等不可修改的量
2.数组的长度不能是变量。虽然 const 定义的是只读变量,就相当于是定义一个常量。但是只读变量也是变量,所以 const 定义的变量仍然不能作为数组的长度。但是需要注意的是,在 C++ 中可以!C++ 扩展了 const 的含义,在 C++ 中用 const 定义的变量也可作为数组的长度。
const VS define
很多人在学习 const 的时候都会混淆它与 define 的区别。从功能上说它们确实很像,但它们又有明显的不同:
1
define是预编译指令,而const是普通变量的定义。define定义的宏是在预处理阶段展开的,而const定义的只读变量是在编译运行阶段使用的。
2.
const定义的是变量,而define定义的是常量。define定义的宏在编译后就不存在了,它不占用内存,因为它不是变量,系统只会给变量分配内存。但const定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元。可以说,常变量是有名字的不变量,而常量是没有名字的。有名字就便于在程序中被引用,所以从使用的角度看,除了不能作为数组的长度,用const定义的常变量具有宏的优点,而且使用更方便。所以编程时在使用const和define都可以的情况下尽量使用常变量来取代宏。
3.
const定义的是变量,而宏定义的是常量,所以const定义的对象有数据类型,而宏定义的对象没有数据类型。所以编译器可以对前者进行类型安全检查,而对后者只是机械地进行字符替换,没有类型安全检查。这样就很容易出问题,即“边际问题”或者说是“括号问题”。
const 在 *指针的左边
const在*的左边对指针有什么影响呢?
int main() { int a = 10; int* p = &a; *p = 20; printf("%d", a); return 0; }
这段代码表示通过对指针p解引用改变了a的值。
如果将const 加在int *p=&a;的前面 const int *p=&a;
则
const 修饰的是 * p,使得 *p指向的内容(也就是a)不能修改了,所以 *p(a)不能再改变了。
指针指向的内容不能改变但指针是可以改变的,
int main() { int a = 10; int b = 20; const int* p = &a; *p = 20;//这个操作是不可以的 p = &b;//这个操作是可以的 return 0; }
还有const在int的左边和右边是一样的都是修饰 *p的
int main() { int a = 10; const int* p = &a —————— int const *p=&a; 两种写法是一样的,都是修饰*p 都是在*的左边 return 0; }
const 在 *指针的右边
const在*右边修饰的是指针了,倒置指针无法修改,但是指针指向的内容是可以修改的。
int main() { int a = 10; int b = 20; int* const p = &a; //cosnt在*的右边修饰的是指针变量p,所以指针变量p无法修改,但是指针p指向的内容可以修改 p = &b;//这个操作是不行的 *p = 20;//这个操作是可以的 return 0; }
总结:
const对指针的影响:
*const在 * 的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在 的右边,则指针的指向不可变。简记为"左定值,右定向"简记"左定值,右定向"