彻底理解——指针常量和常量指针、指向常量的常指针

前言

  在汉语中,定语一般都放在中心词的前面,像C语言和C++语言这种技术性语言,更是如此。
  所以定语重要还是中心词重要,肯定是中心词重要。

  如:美丽的女孩 美丽的是定语 女孩是中心词
  女孩肯定是重要,是本质。

  同理,我们先不讲技术,先从字面意思来理解:指针常量、常量指针、函数指针、指针函数、数组指针、指针数组

指针常量 指针是定语,常量是中心词,所以指针常量本质是一个常量
常量指针 常量是定语,指针是中心词,所以常量指针本质是一个指针
函数指针 本质上是一个指针,那就是指向函数的指针
指针函数 本质上是一个函数,只不过函数的类型是指针
数组指针 本质上是一个指针,只不过是指向数组的指针
指针数组 本质上是一个数组,只不过数组元素都是指针

一、 指针常量——指针类型的常量(int * const p)

巧记: const的作用就是将被修饰者限定为常量,所以const修饰谁,谁就是常量。

指针常量(指针本身是常量)

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

关键点:

  1. 它是个常量!
  2. 指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化;
int* const p;

白话解释:

  本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化。用法如下:

int a = 10, b = 20;
int * const p = &a;
*p = 30;      // p指向的地址是一定的,但内存地址空间中的内容可以修改

二、 常量指针——指向“常量”的指针(const int *p, int const *p)

巧记:常量在指针前面, 程序语言: const在星号之前即可。

定义:又叫常指针,可以理解为常量的指针,指向的是个常量

关键点:

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

常量指针本质上是一个指针,常量表示指针指向的内容,说明该指针指向一个“常量”。在常量指针中,限制了通过这个指针修改变量的值,指针看起来好像指向了一个常量。用法如下:

int a = 10, b = 20;
const int *p = &a;
p = &b;    // 指针可以指向其他地址,但是内容不可以改变

判断程序的对错:

int main()
{
    
    
char * str = “apple”;
str = “orange”;
cout << str << endl;
getchar();
}

这个在vs2015上能够编译通过,但是在vs2017和vs2019上是不能编译通过的。
分析:因为"apple" 是存储在全局(静态变量)区,是只读的,不能修改。所以指向只读常量的指针必须声明为常量指针才能编译通过。

int main()
{
    
    
   const char * str = "apple";
    str = "orange";
    cout << str << endl;
    getchar();
}

这样写就能在vs2017和vs2019上编译通过了。

三、 指向常量的常指针

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

关键点:

  1. 一个指针常量,指向的是一个指针对象;
  2. 它指向的指针对象且是一个常量,即它指向的对象不能变化;
const int* const p;

声明:

整理自博客:C/C++语言基础知识,欢迎大家访问原博客

猜你喜欢

转载自blog.csdn.net/weixin_43283397/article/details/109387374