`
rocky2com
  • 浏览: 38753 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

const常量、指向常量的指针和常量指针

 
阅读更多

const常量、指向常量的指针和常量指针


---------------------------------
1
)先看const常量的情况:

const int a=2;
int const b=c; // c
是已经声明过的整型
两者都可以。本地的const常量必须在第一次声明时就初始化,用变量或常量初始化都可以,只是初始化一次以后它的值就不能再改变了,此所谓const的含义。

2
)接着看指向常量的指针:

const int *pa;
int const *pa;
两者也等价。因为指向常量的指针有时候会指向常量,所以它具有这个性质:不能靠解引用改变它指向的对象的值,以此保护它所指向的常量的常量性:
*pa =d; //
不可行(d是已经声明过的整型)

但指针本身的值是可变的:
pa=& d; //
可行(d是已经声明过的整型)

而且指向常量的指针有时候也会指向变量,如下:
int t,u;
const int *pa;
pa =&t; //
可行,指向变量t
pa =&u; //
也可行,指向变量u

我们可以把它理解成:为了指向常量而发明的指针,这样比较贴切。

3)
然后看常量指针的情况:

int *const pa =&n; // n
是之前已经声明过的整型变量,注意必须是变量,理由见下

常量指针即指针本身的值是常量,但能靠解引用改变它指向的对象的值,如下:
pa=&d; //
不可行(d是已经声明过的整型)
*pa =d; //
可行(d是已经声明过的整型)

因为常量指针也是一种const常量,所以它同样必须在第一次声明时就初始化,不过它的初始值缩小为只能是变量(的地址),因为只有变量才能确保以后能靠解引用而改变它指向的对象的值。这使得常量指针不象一般的const常量,用变量或常量初始化都可以。
也就是说,常量指针反而总是指向变量的。

4
)最后,是前面两者的结合:指向常量的常量指针
const int *const c=&e; //e
是已经声明过的整型,整型常量或整型变量都可以

把它理解成一个普通的const常量,同时被剥夺了靠解引用改变它指向的对象的值的性质的就行。

5
)关于记忆技巧:
对于区分const int *paint *const pa这两者,
前者中,const直接修饰*(不考虑int,因为类型在这里是没影响的),说明*(解引用)这种行为具有常量性,即不能靠解引用改变它指向的对象的值,即指向常量的指针。
后者中,const直接修饰pa,说明pa本身的值具有常量性,即常量指针。

或者也可以这样来记忆:
const int a; // const
常量
const int *a; //
指向常量的指针
int *const a=&n; //
常量指针
你在纸上按顺序写下以上三行,记住它们的注释长度:短长短,
分别对应着:const常量、指向常量的指针、常量指针这三种,应该就不会混淆了。

个人认为以上记忆法比《Effective ++》条款21中推荐的划线分左右法更好记。

1:也有教材反过来把上述第二者称呼为常量指针,第三者称呼为:指针常量,相对来说更容易让人混淆,大家还是只记住上面的那种称呼法就好。

2consttypedef在一起时容易让人陷入陷阱,具体见《typedef的用途和陷阱》。

分享到:
评论

相关推荐

    函数指针和指针函数,const的用法,指针常量,常量指针的用法

    函数指针和指针函数的区别,以及const的用法,指针常量,常量指针的用法

    详细分析c++ const 指针与指向const的指针

    最近在复习C++,指针这块真的是重难点,很久了也没有去理会,今晚好好总结一下const指针,好久没有写过博客了,记录一下~ ... //指向整形的常量指针 ,它不能在指向别的变量,但指向(变量)的

    详解C语言中的常量指针和指针常量

    在这篇文章中,我们将解释常量指针,指针常量,const pointer to const(ps:楼主以为这可以翻译成指向常量的常量指针)的区别 常量指针 让我们先来理解什么是常量指针。常量指针是指指针指向的地址是常量。换句话说...

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

    对于指针和常量,有以下三种形式都是正确的: 代码如下:const char * myPtr = &char_A;//指向常量的指针char * const myPtr = &char_A;//常量的指针const char * const myPtr = &char_A;//指向常量的常量指针下面...

    指针常量与常指针CONST

    此程序是指针常量、常量指针改变对应值方法

    const 指针

    <类型> const * <指针变量> 或 const <类型> * <指针变量> 2、常量指针: <类型> * const <指针变量> 3、指向常量的常量指针: <类型> const * const <指针变量> 或 const <类型> * const <指针变量>

    const用法 const int *a; int * const a;

    const char* pCh; // 指向字符串常量的指针; 表示pch是一个指针,指向字符串常量。根据需要还可以指向另一个字符串。 但字符串不能被改变。... //a是一个指向整型常量的常量指针(两者都不可以修改)

    常量指针和指针常量,函数指针和指针函数的记忆方法

    参考链接: ...倒着读: char * const s s is a const pointer to char,翻译:s是一个常量指针(所以s的指向是固定的),指向char类型,但s的指向地址的内容是可变的 const char * s; s is

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

    常量指针就是指向常量的指针,换句话说,就是指针指向的是常量,它指向的内容不能发生改变,不能通过指针来修改它指向的内容。但是,指针自身不是常量,它自身的值可以改变,从而指向另一个常量。 2.指针常量与常量...

    C语言中常量指针与指针常量区别浅析

    常量指针是指–指向常量的指针,顾名思义,就是指针指向的是常量,即,它不能指向变量,它指向的内容不能被改变,不能通过指针来修改它指向的内容,但是指针自身不是常量,它自身的值可以改变,从而指向另一个常量。...

    54_常量指针和指针常量的区别1

    1. 便于类型检查,如函数的函数 func(const int a) 中a的值不允许变,这样便于保护实参 2. 功能类似于宏定义,便参数的修改和调整 3. 节省

    指向变量的常指针与指向常变量的指针详细解析

    常(量)指针常指针就是我们说的指向常量的指针,顾名思义,它是用来指向常量的。 用常指针指向常变量实际上,C++规定只能用指向常变量的指针指向常变量,普通指针指向它就会报错,原因也很容易理解,我们用普通指针...

    C++中const用法总结.doc

    C++中const用法总结.doc C++中const用法总结.doc 1. const修饰普通变量和指针 2. const修饰函数参数 3. const 修饰函数返回值 4. const修饰类对象/对象指针/对象引用 ...7. const常量与define宏定义的区别

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

    总结: 1.常量数据成员,形式:const Type m_tData; 1)常量数据成员,需要在构造函数列表中给出,构造函数中可以用常量赋值,也可以实例化的时候...3.返回常量的函数,可以是常量指针,指针常量,常量,形式: const

    C语言关键字const和指针的结合使用

    const int * 与 int const *是一样的效果,指向的内存是不能改变的,即指针指向的内容是只读的,或者说是一个常量。不过指向的位置是可以更改的,即p1和p2可以重新指向别的常量。 而char *const 刚好相反,表示指针...

    C++ 中const总结

    C++ 中const总结 const 限定符把一个对象转换成一个常量,如 const int bufSize=512; 申 ...下面将详细的讨论一下 const 变量的作用域、const 指针、指向 const 对象的指 针、const 引用的相关用法。

    华为软件测试工程师笔试题及部分答案

    华为软件测试工程师笔试题及部分答案 1。什么是预编译,何时需要预编译: ... //常量指针,p的值不可以修改 char const * p;//指向常量的指针,指向的常量值不可以改 const char *p; //和char const *p

    关于c语言指针的两处小tip分享

    常量指针是指指向常量的指针,例如:char const *st[4]=”str”;或者使用下面的方法,效果是一样的:const char *st[4]=”str”; 它声明了一个指针变量,这个指针指向了一个常量字符串,但是由于指向的内存空间是...

    C语言中的const和free用法详解

    注意:C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候。如果是C的话,请一定要建立一个后缀为C的文件...//const用作常量,int const a和const int a是一个意思都是表示常量,可以通过指针来改变常

Global site tag (gtag.js) - Google Analytics