前言
const int *p
和int const *p
和int * const p
,这三个好基友,总有人认不清的,对吧?
好,我就认不清。
嗯,总结一下,方便以后忘了怎么回事的回来看看
一 正文
1.1 问题描述
首先,const int *p
和int const *p
是一模一样的,没区别, 一个意思,随你想怎么写。下面以const int *p
为例。
然后,就是区分const int *p1
和int *const p2
。
1.2 结论
int const *p1; //指向整型常量的指针,表示*p1的值不能改变,而p1(即地址)是可以改变的;
int * const p2; //p2为一个指向整型的常量指针. p2(地址)是常量,不可改变,但是*p2的值可以改变
1.3 分辨记忆方法
看const
的左边是谁。
1)如果const
的左边是类型
,那么说明,这个类型值是不能动的,即,这是指向一个不能动的值(常量)的指针。所以int const * p1
是一个指向整型常量的指针。
2)如果const
的左边是*
,那么说明,这个指针是不能动的(*
意味着指针嘛),即,这是一个不能动的指针(常量指针)。所以int * const p2
是一个指向整型的常量指针。
二 例子
2.1 例一
int main(){
const int x=5;
const int *ptr;
ptr=&x;
*ptr=10;
printf("%d\n",x);
return 0;
}
解答:编译出错。
const int x= 5
,意味着x
是个常量,不能变。const int *ptr
是个指向整型常量的指针。
- 指针可以指向别的整型常量,所以
ptr = &x
可以 ✔️ - 但是不能通过改变它指向的值,所以
*ptr=10
不行。❌ - 同时要记得一点,const是通过编译器在编译的时候执行检查来确保实现的。
这道题主要是讲解const与指针的问题:
1) const int a;
2) int const a;
3) const int *a;
4) int * const a;
5) const int * const a;
6) int const * const a;
前两个的作用是一样,a是一个常整型数;
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以);
第四个意思a是一个指向整型 数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的);
最后两个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数 是不可修改的,同时指针也是不可修改的)。
2.2 例二
// 看const左侧是谁,左侧是类型名,就是指向的值不能变的,可以修改指针;
// 左侧是*,说明指针是不能变的,但是可以改变指向的值
int *pi; //pi是一个指向整型的指针
int const *pi; //指向整型常量的指针,表示*pi的值不能改变,而pi(即地址)是可以改变的;
int * const cpi; //cpi为一个指向整型的常指针. cpi(地址)是常量,不可改变,但是*cpi的值可以改变
int const * const cpci; //指针本身和它所指向的值都是常量,不允许修改
#include<iostream>
using namespace std;
int main(){
//指向常量的指针
int a = 80;
int const *p = &a;//指向整型常量的指针
cout<<*p<<endl;
//*p = 70;//错误,指针指向是整型常量。指针指向的变量的值不可通过该指针修改
int b = 70;
p = &b; // 指针本身可以改,指向别处
cout<<*p<<endl<<endl;
//指针是常量,常指针
int c = 60;
int * const p1 = &c;//指针是一个常量,指针的值不能改,只能指向这个地方,但是指向地方的值可以改
cout<<*p1<<endl;
*p1 = 50;
//int d = 40;
//p1 = &d;//错误,是常量的指针,不能改变指针自身的值
cout<<*p1<<endl;
return 0;
}