美文网首页
【C++拾遗】详解C++中的指针和const

【C++拾遗】详解C++中的指针和const

作者: 超级超级小天才 | 来源:发表于2019-08-06 15:59 被阅读0次

这是C++类一些重点难点知识笔记的第 一 篇,同专题的其他文章可以移步:https://www.jianshu.com/nb/39156122

对于将const应用于指针,这个问题是很微妙又复杂的,因为存在两种情况:

  • 将const作用于指针指向的值,使指针指向一个常量对象,这样可以防止使用指针来修改其指向的值,但是指针所指的位置可以随意更改,即可以更换指针指向的变量,但是那个const的变量本身是无法修改的
  • 将const作用于指针本身,这样可以防止改变指针指向的位置,但是该位置所存储的值是可以改变的,即可以通过指针指向的变量修改该地址存储的值

指针指向常规变量

int myInt=10;
const int * pt = &myInt;

这里的pt是一个指向 const int(10)的指针,因此无法使用pt来修改这个值,即 *pt 的值为const,不能被修改,如 *pt+=1 是不行的。

但是在这里,myInt本身并不是const的常量,而是对于pt而言,这个值是常量,也就是说无法利用pt来修改myInt的值,但是可以直接修改myInt本身:

*pt = 20;     // 不合法的
myInt = 20;     // 合法的

但是这种情况下,可以将一个新的地址赋给pt,这就也很微妙,虽然pt无法改变其所指向的地址存储的值,但是可以改变其所指向的地址,比如可以将一个新的地址赋给pt

int anotherInt = 30;
pt = &anotherInt;

尽管改了新的地址,但是由于pt本身是一个指向常量的指针,所以依然无法改变新的地址存储的值(这里的30)

常规指针指向变量

int myInt=10;
int* const pt = &myInt;

当const的位置改变,这种情况下,表示pt指针是一个const的常规指针,它只能指向myInt而不能改变指向的地址,也就是不能再对其赋一个新的值,但是由于myInt本身是一个变量,所以可以通过myInt改变10这个值,也可以通过pt来改变这个值。

*pt=20;     // 合法的
pt=&anotherInt;     // 不合法的

指向常规对象的常规指针

int myInt = 10;
const int* const pt = &myInt;

这是前两种情况的组合,此时pt只能指向myInt,并且pt不能用来修改myInt的值,即 pt*pt 都是const。

常规指针指向常规变量

const int myInt=10;
const int* pt = $myInt;

此时既不能使用myInt更改10这个值,也不能使用pt来修改10这个值。

一种不允许的情况

const int myInt = 10;
int* pt = &myInt;

这种情况是不允许的,因为如果这个赋值成立,那么const的状态就很奇怪了,myInt本身是常量,却可以使用pt指针来修改,所以这种情况是不合法的

指针、数组与函数的参数传递

我们知道,函数对于传递数组作为参数,根据函数是否有权限改变数组的值,通常有两种声明方式:

void functionModify(int arr[], int size);   // 1号函数
void functionNoChange(const int arr[], int size);   // 2号函数

此时,如果我们有两个数组:

cosnt int array1 = {1,2,3}; // 1号数组
int array2 = {4,5,6};   // 2号数组

很明显,一个是常量数组,一个是变量数组。两种数组对于两个函数的关系是这样的:

  • 禁止将常量数组的地址赋给非常量指针,即:1号数组不能传递给2号函数,只能传递给1号函数
  • 可以将非常量数组赋给常量或非常量指针,即:2号数组可以被传递给1和2号函数

因此,在设计函数时,要尽可能地使用const,因为将指针参数声明为指向常量数据的指针可以:

  • 避免由于无意间修改数据而导致的编程错误
  • 使用const使得函数能够处理const和非const实参,否则将只能接受非const数据

所以,如果条件允许,则应将指针形参声明为指向const的指针


转载请注明出处,本文永久更新链接:https://blogs.littlegenius.xin/2019/08/05/【C-温故知新】二指针/

相关文章

  • 【C++拾遗】详解C++中的指针和const

    这是C++类一些重点难点知识笔记的第 一 篇,同专题的其他文章可以移步:https://www.jianshu.c...

  • C++基础

    C++ 值传递、指针传递、引用传递详解C++中引用传递与指针传递区别 引用传递和指针传递的区别 引用的规则:(1)...

  • const理解

    关于const *和* const的理解,可以参考[C C++ OC指针常量和常量指针区别]这篇文章。 该篇文章中...

  • c++ volatile关键字

    Ref cppreference - const vs volatileC/C++中volatile关键字详解 v...

  • 一、C++中的const、define

    C 语言中 在C语言中,const是个假语法,const 中的变量可以通过指针修改,例如: C++中 const ...

  • 常应用问题

    C++ const 常指针:const int* ptr;const 修饰int*,ptr指向整形常量,ptr指向...

  • C++中的const和指针

    C++中的const可以与指针一起使用,通常可以归纳为3种:指向常量的指针,常指针,指向常量的常指针。 (1)指向...

  • 【C++拾遗】详解C++中的函数指针

    这是C++类一些重点难点知识笔记的第 三 篇,同专题的其他文章可以移步:https://www.jianshu.c...

  • 《kotlin实战》阅读笔记(1)

    变量 分为 可变的引用(var) 不可变的引用(val) 可变和不可变类似于c++ 中 const 对于指针的限定...

  • C++中容易被忽略的基础知识

    const和define的区别C++中static关键字的总结C++中的构造函数及深拷贝浅拷贝c++基础之引用和指...

网友评论

      本文标题:【C++拾遗】详解C++中的指针和const

      本文链接:https://www.haomeiwen.com/subject/hpkwdctx.html