- 如果用const修饰普通变量,那么普通变量就变成了只读的,相当于常量。
在程序的任何地方都可以声明。
语法:const 数据类型 常量名=值;
特点:在程序中不允许修改常量的值,否则编译会报错。 - const修饰指针的方式有三种:常量指针,指针常量和常指针常量,实际开发中,实际上之后用到第一种,常量指针。
(1)常量指针
语法:const 数据类型* 变量名
特点:不能通过解引用的方法修改内存地址中的值,但是用原始的变量名是可以修改的。
例:用解引用的方式修改会报错int a = 3, b = 8; const int* p = &a; cout << "a=" << a << ",*p=" << *p << endl; //常量指针的特点:不能通过解引用的方法修改内存地址中的值,但是用原始的变量名是可以修改的。 *p = 10;//此行修改常量指针所指地址中的值,因此此行报错 system("pause");
例:可以使用原始变量修改
int a = 3, b = 8; const int* p = &a; cout << "a=" << a << ",*p=" << *p << endl; //常量指针的特点:不能通过解引用的方法修改内存地址中的值,但是用原始的变量名是可以修改的。 /* *p = 10;//此行修改常量指针所指地址中的值,因此此行报错 */ //用原始的变量名是可以修改的。 a = 13; cout << "a=" << a << ",*p=" << *p << endl; system("pause"); return 0;
(2)注意(常量指针的应用场景)
(a)指向的变量(对象)可以改变,之前指向变量a的,后来可以改为指向变量b
例:
//注意(a):指向的变量(对象)可以改变,之前指向变量a的,后来可以改为指向变量b
p = &b;
cout << "b=" << b << ",*p=" << *p << endl;
(b) 一般用于修饰函数的形参,表示不希望在函数里修改内存地址中的值
void func(const int* no, const string* str)
{
//这两句会报错,因为常量指针不允许通过解引用的防止修改地址中的值
/*
*no = 8;
*str = "我是一只小小鸟";
*/
cout << "亲爱的" << *no << "号,我是" << *str << endl;
}
(c)如果常量指针用于形参,虽然指向的对象可以改变,但是这么做没有任何意义
(d)如果形参的值不需要改变,建议加上const修饰,程序可读性更好,因为其他人看到函数声明,就能明白你的意图。
(2)指针常量
语法 :数据类型* const 变量名
特点:指向的变量(对象)不可改变
注意:(实际开发中几乎不用)
(a)在定义的同时必须初始化,否则没有意义
(b)可以通过解引用的方式修改地址中的值
例:
int* const p1 = &a;//p1是指针常量,声明的时候必须初始化,否则会报错
*p1 = 6;//指针常量可以通过解引用的方式改变地址中的值
cout << "a=" << a << ",*p1=" << *p1 << endl;
(3)常指针常量(在实际开发中没什么用)
语法:const 数据类型* const 变量名
特点:指向的变量(对象)不可改变,不能通过解引用的方式改变内存地址中的值。
总结:
常量指针:指针指向可以改,指向的值不可以改----------------指向常量的指针
指针常量:指针指向不可以改,指向的值可以改--------------指针是常量
常指针常量:指针指向和指向指针的值都不可以改