將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。