C++知识点:const与指针

1. const指针的三种写法

C++种const指针有三种写法

1
2
3
int const *pt = const int *pt; //第一种
int *const pt; //第二种
const int *const pt; //第三种

2. 三种const指针的区别和用例

三种const指针可以通过区分*const的位置来确定不同的功能。简而言之,*const为可以修改指向地址的而不能修改指向的地址,*const为可以修改指向的地址但不可以修改指向地址的值。如果*前后都有const则地址和值都不可以修改。

2.1 第一种const指针

int const *pt;

第一种const指针*const之后,所以可以修改指向的地址,但不可以修改指向地址的值。

1
2
3
4
5
6
7
8
9
10
int n = 10;
int const *pt;

pt = &n; //让pt指向n的地址
cout << "Address of pt is " << pt << endl;
*pt = 20; //不允许,报错为:表达式必须为可修改的左值

int m = 20;
pt = &m; //允许,将pt重新指向m的地址
cout << "Address of pt is " << pt << endl;

注释掉报错行,输出为

1
2
Address of pt of n is 0x61fe14
Address of pt of m is 0x61fe10

2.2 第二种const指针

int *const pt;

第二种const指针*const之前,所以可以修改指向地址的值,但不可以修改指向的地址。

1
2
3
4
5
6
7
8
9
10
int n = 10;
int *const pt = &n; //让pt指向n的地址

cout << "Value of pt is " << *pt << endl;

*pt = 20; //允许,修改n的值为20
cout << "Value of pt(modified) is " << *pt << endl;

int m = 30;
pt = &m; //不允许,报错为:表达式必须为可修改的左值

注释掉报错行,输出为

1
2
Value of pt is 10
Value of pt(modified) is 20

2.3 第三种const指针

const int *const pt

第三种const指针*前后都有const,所以地址和值都不可以修改。

1
2
3
4
5
6
7
int n = 10;
const int *const pt = &n; //让pt指向n的地址

*pt = 20; //不允许,报错为:表达式必须为可修改的左值

int m = 30;
pt = &m; //不允许,报错为:表达式必须为可修改的左值

3. 尽可能在函数形参中使用const指针

如果不希望在函数内部修改数组的值或地址,则应该使用const指针来作为形参传参。例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;

void show_array(int const *pt, int n);

int main(void){
int size = 5;
int arr[size] = {1,2,3,4,5};
show_array(arr, size);
return;
}



void show_array(int const *pt, int n){
for (int i = 0; i < n; i++){
cout << *pt << endl;
}
}