const int *p 和int const *p和int * const p,总有人搞不懂,对吧

前言

const int *pint const *pint * const p,这三个好基友,总有人认不清的,对吧?

好,我就认不清。

嗯,总结一下,方便以后忘了怎么回事的回来看看

一 正文

1.1 问题描述

首先,const int *pint const *p是一模一样的,没区别, 一个意思,随你想怎么写。下面以const int *p为例。

然后,就是区分const int *p1int *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;
} 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值