一 .const修饰普通变量
const修饰的变量会转换为一个常量
例:
int main(int argc, char *argv[])
{
const int a = 10; //定义一个常量a
int const b = 5; //定义一个常量b 两种方法相等
const int c; //error 常量定义时必须初始化
int d; //定义一个普通变量d
a = 11; //error 尝试修改常量
b = 6; //error 尝试修改常量
d = 1; //给变量赋值
}
二.指向const对象的指针
如果指针指向const对象,则不允许用指针来改变其所指向的const值。为了保证这个特性,c++语言要求指向const对象的指针也必须具有const特性。指向const对象的指针在定义时不需要处死哈哈,如果需要的话,允许给指针重新赋值,使其指向另一个const对象,但不能通过指针修改其所指对象的值。
例:
int main(int argc, char *argv[])
{
const int *pa; //定义指向const对象的指针pa,可以不初始化
int const *pb; //效果同上
int *pc; //定义普通int型指针
const int a = 10, b = 20; //定义const变量 a和b
pa = &a; //给pa赋值
pa = &b; //可以修改pa的值
*pa = 20; //error 不能修改pa指向的值
pc = &a; //error 指向const对象的指针类型也必须是const类型
}
例:
int main(int argc, char *argv[])
{
const int *pa; //定义指向const对象的指针pa,可以不初始化
int a = 30; //定义普通变量a
pa = &a; //指向const对象的指针可以指向非const对象
*pa = 10; //error 同样不能修改const指针指向的内容
printf("%d\n",*pa); //输出30
a = 10; //虽然不能直接修改pa指向的内容,但是由于pa指向的是非const对象,
//可以通过其他方法来修改pa指向的内容
printf("%d\n",*pa); //输出10
}
三.const指针
const指针本身的值不可以修改,但是它指向的内容可以被修改。
例:
int main(int argc, char *argv[])
{
int a = 10, b = 20; //定义普通int型变量a和b
int* const pa = &a; //定义const指针pa const指针必须初始化
const *int pb = &a; //error 没有这个形式
pa = &b; //error 不能修改pa的值
*pa = b; //可以修改pa指向的值
}
四.指向const对象的const指针
指向const对象的const指针,既不能修改指针指向的内容,也不能修改指针本身的值。
例:
int main(int argc, char *argv[])
{
const int a = 10, b = 20; //定义const变量a和b
int* const pa = &pa; //error 指向const对象的指针必须是const类型指针
const int *const pa = &a; //定义指向const对象的const指针
*pa = 20; //error 不能修改指针指向的内容
pa = &b; //error 不能修改指针本身的值
}
函数的形参可以是const类型,函数形参是const类型,在函数内部不能修改参数的值。
例:
void function(const int i)
{
i = 20; //error 不能修改参数的值
}
int main(int argc, char *argv[])
{
int i = 10;
function(i); //如果形参为非引用const类型,实参既可以传const类型,也可以传非const类型
}
例:
void function(int i)
{
i = 20; //可以修改,i是实参的一个副本
}
int main(int argc, char *argv[])
{
const int i = 10;
function(i); //如果形参为非引用普通类型,实参既可以传const类型,也可以传非const类型
}
例:
void function(const int *i) //参数为指向const对象的指针
{
int a = 10;
*i = 20; //不能修改实参指向的内容
i = &a; //可以修改i本身的值
}
int main(int argc, char *argv[])
{
int i = 10;
int *p = &i;
function(p); //如果形参为指针或引用const类型,实参既可以传const类型,也可以传非const类型
}
例:
void function(int *i)
{
*i = 20;
}
int main(int argc, char *argv[])
{
const int i = 10;
const int *p = &i;
function(p); //<span style="font-family: Arial, Helvetica, sans-serif;">如果形参为指针或引用非const类型,实参只能传非const类型</span>
}
例:
void function(int* const i) //参数为const指针
{
int a = 10;
*i = 10; //可以修改指针指向的内容
i = &a; //error 不可以修改指针的本身的值
}
int main(int argc, char *argv[])
{
int i = 10;
int *p = &i;
function(p);
}
const char* ptr(char const *prt)指针指向的值是常量
char *const ptr 指针本身的值是常量
例:
int main(int argc, char *argv[])
{
char* pa = "aaaa";
const char* pb = "bbbb";
pa = "cccc"; //可以修改指针本身的值
pb = "cccc"; //<span style="font-family: Arial, Helvetica, sans-serif;">可以修改指针本身的值</span>
pa[0] = 'd'; //编译通过,运行报错,pa指向的是常量,不能修改pa指向的内容
pb[0] = 'd'; //编译报错,pb指向的是const型数据
}
例:
int main(int argc, char *argv[])
{
char* const pa = "aaaa";;
pa = "bbbb"; //不能修改pa本身的值
}