将const用于指针,有两种情况:
const int *pt;
int * const pt;
目录
1. const int *pt
2. int * const pt
3. 扩展
1. const int *pt
首先看第一种情况,const在int的前面,有如下语句:
int peoples=12;
const int *pt = &peoples;
上面代码表示pt指向的是一个整型常量,*pt是const,不能通过使用pt来修改整型常量的值,以下语句都是非法的。
*pt += 1;///非法,*pt是常量
cin >> *pt;//非法,*pt是常量
const int *pt指针的一个实例:
#include <iostream>
using namespace std;
int sum_arr(const int *begin, const int *end)
{const int *pt;int total = 0;for (pt = begin; pt != end; pt++){total = total + *pt;}return total;
}int main()
{int cookies[6] = { 1,2,4,6,8,10 };int sum = sum_arr(cookies+1, cookies+4);cout << sum << endl;sum = sum_arr(cookies, cookies + 6);cout << sum << endl;return 0;
}
输出结果:
程序说明:
程序的功能是通过一个函数求一个数组中部分元素或所有元素之和,函数通过两个参数设定数组的区间,并求该区间的所有元素之和。
在C++中,处理数组的函数必须要有数组元素的数据类型,数组的起始位置以及数组中元素数量。传统做法是将数组的起始位置和数组的长度传递给函数,还有另一种给函数提供信息的方法,即指定数组元素的区间,可以通过传递两个指针来完成,一个指针标识数组的开头,另一个指针标识数组的结尾。对于数组来说,表示数组结尾的参数是指向最后一个元素后面的指针。例如代码中的cookies+6,它指向了数组最后一个元素后面的位置。数组名cookies指向第一个元素,cookies+5指向最后一个元素,因此cookies+6指向数组结尾后面的一个位置。将区间传递给函数,告诉函数要处理哪些元素。代码中将cookies+1和cookies+4传递给函数意味着求第2个至第4个元素之和,所以程序输出结果应为12。将cookies和cookies+6传递给函数意味着求整个数组元素之和,所以程序输出结果应为31。
再来看求和函数的实现,首先定义了一个指向常量的指针,然后通过一个循环,常量指针被赋不同的值再相加。可能有同学会疑惑,pt是一个指向常量的指针,怎么可以被赋不同的值。答案是可以的,const int *pt;它只是表示不能通过*pt来改变*pt的值,但可以通过其他方式来改变*pt的值。以下代码是合法的:
int age1 = 5;
int age2 = 10;
const int *pt2 = &age1;
cout << "*pt2: " << *pt2 << endl;
pt2 = &age2;
cout << "*pt2: " << *pt2 << endl;
结果输出如下:
*pt2通过被赋不同的值,实现了*pt2值的改变。
在函数形参为指针时,将指针参数声明为指向常量数据的指针有两个好处:
- 可以避免因无意间修改数据而导致的错误;
- 使用const使函数可以处理const和非const实参,否则只能接受非const数据;
因此,如果条件允许,应将指针形参声明为指向const的指针。
2. int * const pt
int age = 10;
int * const pt = &age;
*pt += 2;
cout << "age = " << age << endl;
上面的代码表示pt只能指向age,pt是const,不能指向其他变量,但可以通过*pt来改变age变量的值,上面代码的输出结果为:age = 12。
int * const pt 这种声明在实际编程中很少用。
3. 扩展
const float age = 10;
int *pt = &age;///赋值错误
上面代码中试图将一个常量整型的地址赋给pt,这是非法的,age被声明为常量,其值不可改变。如果age的地址可以被赋给pt,这里pt不是一个指向整型常量的指针,因此可以通过pt指针变量来改变age的值,这就使得两条语句矛盾了,因此age的地址不能被赋值给pt。