1.cosnt指针
int age = 39;
const int * pt = &age;
不可以使用pt改变age的值,即*pt是const,不可修改。
*pt += 1; // 非法操作
cin >> *pt; // 非法操作
但是,pt的声明并不意味着它指向的变量(age)为const,而仅仅是说不可以使用pt来修改它指向的变量(age)。
*pt = 20; // 非法操作
age = 20; // ok
2.指向const对象的指针
2.1指向const对象的const指针
const float g_earth = 9.80;
const float * pe = &g_earth; // ok
g_earth 和 pe都为const,都不可以用来修改其所对应的值(9.80)。
2.2指向const对象的非const指针
C++不允许把const地址赋值给非const指针。
const float g_moon = 1.63;
float * pm = &g_moon; // 非法操作
当然,你也可以使用类型转换突破此限制。
3.指向指针的指针
const int **pp2;
int *p1;
const int n = 13;
pp2 = &p1; // 非法操作。先假设合法。
*pp2 = &n; // ok,两者都是const,但 p1 = &n 非法。
*p1 = 10; // 此行的语法是合法的,但不能成功修改n。
因此,把非const地址或指针赋值给const指针的操作只在一次间接地址操作的情况下适用。换句话说,可以把const或者非const的数据赋值给const指针,只要此数据本身不是指针类型。
4.const参数
const int months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
...
int sum(int arr[], int n); // 应该是 const int arr[]
int j = sum(months, 12); // 非法
上面的函数调用试图把const指针(months)赋值给非const指针(arr),将产生编译错误。
小建议:
只要能够使用const,就使用。建议给指针声明添加const有两个原因:
1.可以防止无意的修改数据;
2.使用const允许函数处理const和非const的实参。如果在函数原型中省略const,则函数只可以接受非const的数据。
只要可以,建议把形参声明为const指针。
时间: 2024-11-09 00:40:16