常量指针和指针常量的区别详解_指向常量的指针和常指针

常量指针和指针常量的区别详解_指向常量的指针和常指针大家好,我是极智视界,本文讲解一下 常量指针与指针常量的用法。希望我的分享能对你的学习有一点帮助。

极智Coding

  一起养成写作习惯!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情。

欢迎关注我的公众号 [极智视界],获取我的更多笔记分享

  大家好,我是极智视界,本文讲解一下 常量指针与指针常量的用法。

  常量指针不能用于改变它指向的值,指针常量在初始化后就不能改变。

1 常量指针

  如果作为形参传入到函数中,其在函数内部是不能被修改的。

  常量指针定义:又叫常指针(常量的指针),即这是个指向常量的指针,这个常量是指针的值(地址),而不是地址指向的值。

  关键点:

  • 常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改;
  • 常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值;
  • 指针还可以指向别处,因为指针本身只是个变量,可以指向任意地址。

  代码形式:

数据类型 const 指针变量;
const 数据类型 指针变量;

2 指针常量

  指针常量定义:本质是一个常量,而用指针修饰它。指针常量的值是指针,这个值因为是常量,所以不能被赋值。

  关键点:

  • 它是个常量;
  • 指针所保存的地址可以改变,然而指针所指向的值却不可以改变;
  • 指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化。
  • 使用前要初始化

  代码形式:

数据类型* const 指针变量;

3 指向常量的常指针

  指向常量的常指针定义:指向常量的指针常量就是一个常量,且它指向的对象也是一个常量。

  关键点:

  • 一个指针常量,指向的是一个指针对象;
  • 它指向的指针对象且是一个常量,即它指向的对象不能变化。

  代码形式:

const 数据类型* const 指针变量;
数据类型 const * const 指针变量;

4 示例

4.1 示例一

#include <iostream>

using namespace std;

int main() {
  /// 常量指针
  int a;
  const int *p1 = &a;
  a = 300;
  //*p1 = 56; // 错误,*p1是const int的,不可修改,即常量指针不可修改其指向的内容
  int b = 200;
  p1 = &b;  // 指针可以修改
  
  /// 指针常量
  int* const p2 = &a;
  a = 500;   // 可以通过原来的声明修改值
  *p2 = 400;  // 指针是常量,指向的地址不可以变化,但是指向的地址所对应的内容是可以变化的
  //p2 = &b; // 错误,因为p2是const指针,因此不能改变p2指向的地址
  
  /// 指向常量的常量指针
  const int* const p3 = &a;
  //*p3=1; // 错误
  //p3=&b; // 错误
  a = 600;   // 可以通过原来的声明修改值
}

4.2 示例二

#include <iostream>

using namespace std;

int main() {
  int a = 3;
  int b = 1;
  int c = 2;
  int const *p1 = &b;
  int *const p2 = &c;
  cout << "old vars and pointer's address: " << endl;
  cout << "&a = " << &a << "a = " << a << endl;
  cout << "&b = " << &b << "&c = " << &c << "b = " << b << "c = " << c << endl;
  cout << "p1 = " << p1 << "p2 = " << p2 << "*p1 = " << *p1 << "*p2 = " << endl << endl;
  
  p1 = &a;
  b = 11;
  cout <<"the address and values of const pointer: " << endl;
  cout << "p1 = " << p1 << "*p1 = " << *p1 << endl << endl;
  
  c = 22;
  *p2 = c;
  cout << "the address and values of const pointer: " << endl;
  cout << "p2 = " << p2 <<"*p2 = " << *p2 << endl << endl;
  
  return 0;
}
常量指针和指针常量的区别详解_指向常量的指针和常指针

  从输出结果可以看出,对于常量指针 p1,改变其地址指向,内容也随着地址的改变而变化了;对于指针常量 p2,初始化后地址就固定了,内容可以随时重新赋值。

  对于常量指针 p1,可以改变它指向的地址,但不能改变指向的内容;对于对于指针常量 p2,可以改变它指向地址的内容,却不能改变它指向的地址。

4.3 示例三

#include <iostream>
#include <iomanip>

using namespace std;

const int SIZE = 6;
const double payRates[SIZE] = {18.55, 17.45, 12.85, 14.97, 10.35, 18.89};
const double PAY[SIZE] = {17.2, 11.4, 14.56, 39.12, 28.45, 55.77};

void displayPayRates(const double *rates, int size) {
  cout << *rates << endl;
  rates = PAY;
  cout << *rates << endl;
  cout << setprecision(2) << fixed << showpoint;
  
  for(int count = 0; count < size; count++)
  {
    cout << rates + count << endl;
    cout << "Pay rate for employee " << (count + 1) << " is $ " << *(rates + count) << endl; endl;
  }
}

int main() {
  cout <<"this is payRates's address " << &payRates << endl;
  cout << "this is PAY's addtess " << &PAY << endl;
  displayPayRates(payRates, SIZE);
}
常量指针和指针常量的区别详解_指向常量的指针和常指针

  以上 要注意三点:

  • 作为固定形参的输入 const double *rates,其在 displayPayRates 函数内部不能被重新赋值,即不能出现类似于 rates[0] = 12.56 等这样的代码,但可以出现 rates = &PAY[SIZE] 和 rates = PAY 的代码;
  • rates 最初表示 payRates 常量首地址,其每加 1 则地址向后移动 8 个字节,因为 double 类型占 8 个字节
  • displayPayRates 函数的形参中一定要包含 const 关键字,否则会产生编译器报错。

  好了,以上分享了 常量指针与指针常量的用法。希望我的分享能对你的学习有一点帮助。

 【公众号传送】

《极智Coding | 讲一讲常量指针与指针常量》

logo_show.gif

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13934.html

(0)

相关推荐

  • Python工程师:如何通过pip升级Python包?

    Python工程师:如何通过pip升级Python包?Python是一门强大的编程语言,广泛应用于数据科学、机器学习和Web开发等领域。在Python编程中,我们常常需要使用第三方库,这些库提供了实现各种功能的方法和工具。然而,这些库需要经常更新,以确保其正常运行和安全性。在本文中,我们将深入研究如何使用pip来升级Python包,以保持我们的Python环境最新。

    2024-07-06
    45
  • 智力高低和瞳孔大小有关?瞳孔越大,智商越高「建议收藏」

    智力高低和瞳孔大小有关?瞳孔越大,智商越高「建议收藏」有人说眼睛是通往心灵的窗户,但一项研究表明,眼睛也可能是通往大脑的窗户。人类的瞳孔对光线的应激反应不仅仅是对光线的感受,瞳孔的变化也代表觉醒、注

    2023-07-13
    134
  • lasso特征降维参数选择_高维数据流

    lasso特征降维参数选择_高维数据流海量数据的特征工程中, 如果数据特征维度达到几千乃至上万 常规的lasso很容易失效 这里介绍几种泛义lasso,是在实际数据处理中常用的 迭代与分块思路/分组的使用(有兴趣的同学可自行实践一下) 1

    2022-12-22
    144
  • TiDB 4.0: The Leading Real-Time HTAP Database is Ready for Cloud

    TiDB 4.0: The Leading Real-Time HTAP Database is Ready for Cloud经过一年多的开发,TiDB 4.0 终于迎来 GA 版本,作为 TiDB「面向未来的数据库」道路上面的一个重要的里程碑,TiDB 4.0 不光在稳定性、易用性、性能、云原生等各个方面都有了巨大的进步…

    2023-03-08
    157
  • Python Tuts Definition: 学习如何在Python中创建和管理教程

    Python Tuts Definition: 学习如何在Python中创建和管理教程如今,Python已经成为了编程世界中最为热门的语言之一。Python的简单易学和强大的功能,使得它成为了许多编程初学者和专业人士的首选。刚开始学习Python,掌握Python的基本语法和操作是必不可少的。而学习一个新的编程语言时,最好的方式就是编写教程。Python Tuts定义了一系列教程,帮助用户学习如何在Python中创建和管理教程。

    2024-01-26
    113
  • 如何在MATLAB中使用Python?

    如何在MATLAB中使用Python?MATLAB和Python都是科学计算中常用的编程语言,各有优劣。其中,Python的生态系统更加完备,包含了众多丰富的库和工具。而MATLAB则有其强大的矩阵运算和绘图功能。

    2024-06-22
    46
  • Python GUI开发:使用tkinter创建窗口

    Python GUI开发:使用tkinter创建窗口tkinter是Python自带的一个标准GUI库,可以帮助开发者创建各种窗口界面。本文将从以下几个方面详细介绍如何使用tkinter创建窗口。

    2024-02-19
    107
  • hive窗口函数求上一条数据_grouping函数

    hive窗口函数求上一条数据_grouping函数在Hive中支持窗口函数,Mysql在8.0版本后也支持使用,用好之后犹如开挂! Window Function又称为窗口函数、分析函数。聚合函数可以将多行数据按照规定聚合为一行,一般来讲聚集后的行数

    2023-03-11
    163

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注