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

极智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;
}
极智Coding | 讲一讲常量指针与指针常量

  从输出结果可以看出,对于常量指针 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);
}
极智Coding | 讲一讲常量指针与指针常量

  以上 要注意三点:

  • 作为固定形参的输入 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

今天的文章极智Coding | 讲一讲常量指针与指针常量分享到此就结束了,感谢您的阅读。

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

(0)
编程小号编程小号

相关推荐

发表回复

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