如何理解C++指针常量和常量指针

目录
  • 术语
  • 常量指针(pointer to const)
  • 指针常量(指针)

前言:

应该怎样正确的姿势去理解指针常量和常量指针,到我发布这篇文章时候,感觉自己对指针常量和常量指针理解还是不够透彻,可能接触还是比较少吧,希望自己用一个月的时间可以将自己的 c++ 的功力有一个提升,可以靠 c++ 来混一碗饭。

术语

  • 常量
  • 指针

和引用类似,可以定义指针可以指向常量或者非常量类型。

常量指针(pointer to const)

常量指针,根据字面上理解就是指向常量的一个指针,也就是指针保存了一个存放常量的地址,所以

Like a references to const,a pointer to const may not be used to change the object to which the pointer points。we may store the address of a const object only in a ** pointer to const**

const double pi = 3.14;// pi 是一个常量,常量一旦赋值就不允许改变
double* ptr = π//

这里定义一个普通指针,普通指针变量是无法存储保存常量的内存地址。

const double* ptr = π

那么要定义一个指针变量指向一个存储常量的地址,就需要在前面添加 const 修饰符

*ptr = 12;

既然指向的值是一个常量,也就是无法用 *ptr 为一个常量进行赋值。

那么常量指针是否指向存放从一个非常量的内存地址,答案是可以的,例如下面代码

int a = 12;
const int*  p = &a;

接下来我们来简单看一下代码思考一下,这里稍微有点复杂,首先大家需要思考一下下面代码是否可以执行,然后大家再思考一下两次 *p 输出分别是什么,这里需要大家动手试一试,我就不直接给出输出结果了

int a = 12;
const int* p = &a;

cout << *p << endl;
a = 2;

cout << *p << endl;

我们在看一个例子,这里 const 是修饰 double 可以将 const double* 看作一个整体,也就是指针指向内存地址中存放存放的值是常量。

double pi = 3.14;// pi 是一个常量,常量一旦赋值就不允许改变
const double* ptr = &pi;
double val = 2;
ptr = &val;
cout << *ptr << endl;

指针常量(指针)

指针常量,我们先不看代码,仅从指针常量字面上来进行理解,指针常量落在常量上,常量也就是一个一旦赋值就不能随意改变量,这样理解吧,突然一个好的想法,无论指针常量还是常量指针,哪一个词在前面哪一个就是不能改变的。

int main()
{
	int a = 12;
	int* const p = &a;

	cout << "p: " << *p << endl;

	return 0;
}

也就是指针指向地址不能改变 p = &b; 这样赋值是行不通的,而指针指向内存中存放的值是可以改变的。

*p = 20;

这时候输出 p:20 也就是说明是可以改变指针指向地址对于内存存储的值,这就是指针常量,本质是一个常量,常量类型指针类型,

到此这篇关于如何理解C++指针常量和常量指针的文章就介绍到这了,更多相关C++指针常量内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++中常量与指针的示例详解

    前言 和指针联用有佷微妙的地方,之前一直佷晕,现在来继续研究下.诸如以下: int const; const int; const int* p; int const* p; int* const p; const int* const p; const 是一种处理符号常量的方法,以 const 声明的变量,一般首字母大写,声明之后无法被修改.相比于 define,const 会显式的指定类型.除定义符号外,一般可用于函数声明,表示函数不会修改任何值:用于参数,表示函数不会修改参数:甚至可以用于

  • C++常量详解一(常量指针与常量引用的初始化)

    1.常量 1.1.常量的初始化: const对象一旦创建后其值就不能再改变,所以const对象必须初始化.这里我们要注意一点,像const int *p和const int &r都并不是const对象.因为const int *p只是表示不能通过p改变p所指的对象的值,p的值是可以变的,所以p可以不用初始化.至于r ,引用本身就不是对象,所以r也并不是const对象,r之所以一定初始化,是因为引用必须初始化.对于以上内容,你也可以理解为底层const 修饰的并不是const对象,还要注意像con

  • 简单总结C++中指针常量与常量指针的区别

    我们先回顾下,什么是指针?什么是常量?指针是一种特殊的变量,它里面存储的内容是内存地址.常量是指其里面存储的内容不能发生改变的量.明白了这两个概念后,我们现在正式进入指针常量与常量指针. 1.指针常量与常量指针的概念 指针常量就是指针本身是常量,换句话说,就是指针里面所存储的内容(内存地址)是常量,不能改变.但是,内存地址所对应的内容是可以通过指针改变的. 常量指针就是指向常量的指针,换句话说,就是指针指向的是常量,它指向的内容不能发生改变,不能通过指针来修改它指向的内容.但是,指针自身不是常量

  • C++常量指针,指针常量,指向常量的常指针详解

    目录 什么是指针 内存地址 指针所占内存 const 变量 指针常量,常量指针和指向常量的指针 指针常量 常量指针 指向常量的常指针 空指针.野指针 总结 什么是指针 指针就是指向变量在内存中的地址 数据是存放在内存中的,每一个变量都有一个内存地址,假设是一个int类型变量a,占4个字节的内存区,那么在内存中如果是小端方式存储,我们创建指针p,把a的地址赋值给p,就是把a的首地址0x1100赋值给指针p,这个时候p的值就是变量a在内存中的首地址 int a =10; int*p; p=&a; /

  • 如何理解C++指针常量和常量指针

    目录 术语 常量指针(pointer to const) 指针常量(指针) 前言: 应该怎样正确的姿势去理解指针常量和常量指针,到我发布这篇文章时候,感觉自己对指针常量和常量指针理解还是不够透彻,可能接触还是比较少吧,希望自己用一个月的时间可以将自己的 c++ 的功力有一个提升,可以靠 c++ 来混一碗饭. 术语 常量 指针 和引用类似,可以定义指针可以指向常量或者非常量类型. 常量指针(pointer to const) 常量指针,根据字面上理解就是指向常量的一个指针,也就是指针保存了一个存放

  • 深入const int *p与int * const p的区别详解(常量指针与指向常量的指针)

    对于指针和常量,有以下三种形式都是正确的: 复制代码 代码如下: const char * myPtr = &char_A;//指向常量的指针char * const myPtr = &char_A;//常量的指针const char * const myPtr = &char_A;//指向常量的常量指针 下面依次对这三种类型进行介绍.因为*操作符是左操作符,左操作符的优先级是从右到左,对于1.常量指针(Constant Pointers) 复制代码 代码如下: int * con

  • C语言中指针常量和常量指针的区别

    在面试中我们经常会被面试官问到什么是常量指针,什么又是指针常量. 指针常量就是指针本身是常量,指针里面所存储的内容(内存地址)是常量,不能改变.但是,对应内存地址里存的内容是可以通过指针改变的. 常量指针就是指向常量的指针,指针中所存地址中对应的值是常量,不能通过指针来修改它的值.但是,指针自身不是常量,它自身的值可以改变,从而指向另一个地址. 指针常量与常量指针的声明 指针常量的声明:数据类型 * const 变量名. 常量指针的声明:数据类型 const * 变量名 或者 const 数据类

  • 如何理解C++ 临时变量的常量性

    1.认识临时变量的常量性 关于临时变量的常量性,先看一段代码. void print(string& str) { cout<<str<<endl; } //如此调用会报编译错误 print("hello world"); 在Linux环境使用g++编译,会出现: invalid initialization of non-const reference of type 'std::string&' from a temporary of typ

  • 理解关于Android系统中轻量级指针的实现

    智能指针来源 引发指针错误情况表现常常有如下几个表现情况: 1.申请了内存空间,但是忘记释放指针所指向的对象占用的内存空间. 2.使用了无效的指针. 因此在android的C++代码部分采用了智能指针的技术.智能指针通过一种能够自动危害对象引用计数的技术.来解决C++中指针存在的缺陷问题. 在android系统中提供了三种类型的C++智能指针,分别为:轻量级智能指针.强指针.弱指针. 下面主要通过进行分析轻量级指针的实现原理. 轻量级指针 轻量级指针就是通过利用简单的引用计数计数类维护对象的生命

  • C++ 常量成员常量返回值详解

    总结: 1.常量数据成员,形式:const Type m_tData; 1)常量数据成员,需要在构造函数列表中给出,构造函数中可以用常量赋值,也可以实例化的时候赋值. 2)赋值函数中不能赋值,起到保护常量数据成员的作用,和友元作用相反. 2.常量成员函数,形式:type funname(type1 arg1,type2 arg2,...) const 1)常量成员函数,不能修改类数据成员,不能调用非常量函数. 2)常量成员函数的作用,可以有效的将类的函数分为可以修改类的函数,和不能修改类的函数:

  • C++指针与数组:指针详解

    目录 一. What(什么是指针) 1. 地址初了解 2. 指针概念 3. 指针与指针变量 二. Why(为什么要有指针) 三. How(如何使用指针) 1. 基本定义 2. 取地址操作符 & 3. 解引用操作符 * 4. 结构体指针 5. 多级指针 6.指针变量的命名规范 四. 我对指针的一些理解 总结 本文主要介绍C语言中指针的基本概念与用法,本博文从零开始讲解指针,只要你了解基本的C语法,相信你看完本文后一定会有所收获. 一. What(什么是指针) 1. 地址初了解 要搞明白什么是指针,

  • golang方法中receiver为指针与不为指针的区别详析

    前言 golang的指针receiver和非指针receiver的区别?最近在看网站有同学提问golang中方法的receiver为指针和不为指针有什么区别,在这里我以简单易懂的方法进行说明,帮助刚刚学习golang的同学,下面话不多说了,来一起看看详细的介绍吧. 方法是什么 其实只要明白这个原理,基本就能理解上面提到的问题. 方法其实就是一种特殊的函数,receiver就是隐式传入的第一实参. 举个例子 type test struct{ name string } func (t test)

随机推荐