`
rocky2com
  • 浏览: 40986 次
  • 性别: 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的用法,指针常量,常量指针的用法

    这里 `chrPtr` 是一个指向字符数组的常量指针,可以通过重新赋值让 `chrPtr` 指向其他地址,但是不能通过 `chrPtr` 来修改它所指向的数据。 ### 示例代码解析 以下面的代码为例: ```c #include int f(int x, ...

    常量指针和指针常量的区分问题

    根据给定文件的信息,我们可以提炼出关于“常量指针和指针常量”的相关知识点。下面将对这些概念进行详细的解析。 ### 常量指针与指针常量的概念 #### 1. 常量指针(const int *) **定义**:`const int *p` 这种...

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

    C++ 编程语言中,const 指针和指向const的指针是两个容易混淆的概念,但它们有着不同的定义和使用场景。在本文中,我们将详细分析 C++ const 指针和指向const的指针,帮助读者更好地理解和学习这两个概念。 const ...

    《常量指针和指针常量》

    在C/C++编程语言中,理解“常量指针”和“指针常量”的概念至关重要,因为它们涉及到了指针变量的限制和...在编写涉及内存管理和指针操作的复杂程序时,正确使用常量指针和指针常量能显著提高代码的可读性和可靠性。

    C_C++指针常量和常量指针详解

    而在指针的基础上,衍生出了两种特殊的指针类型——**指针常量**和**常量指针**。 1. **常量指针**: - **定义**:指向常量的指针,这种类型的指针所指向的内容是不允许被改变的。换句话说,一旦指针指向了一个...

    const与指针的关系

    3. **指向常量的常指针(Const Pointer to Const)**: - 定义格式:`const int *const a = &b;` - 这种类型的指针表示指针本身及其指向的内容都是常量,即既不能改变指针的指向,也不能通过该指针修改其指向的...

    C语言中Const指针变量(常指针)

    通过上述知识,我们可以了解到,要想灵活运用指针和const关键字,必须彻底理解指针变量本身和指针所指向的内容之间的区别,以及它们是如何通过const关键字得到保护的。正确地使用const指针可以有效地防止程序中出现...

    C语言中const定义常量

    在这种情况下,`q`是指向整型变量的常量指针,即`q`本身的值(即它指向的地址)不能被改变,但可以通过`q`修改其指向的数据。 #### 五、`#define`预处理指令 除了`const`关键字外,C语言还提供了`#define`预处理...

    指针常量和常量指针

    本文将从一个新手的角度出发,详细介绍“指针常量”和“常量指针”的概念及其区别,力求简单易懂。 ### 指针常量 **指针常量**(Pointer to constant)是一种特殊的指针类型,其指向的数据不能被修改。也就是说,...

    指针常量和常量指针(总结)

    - **定义**:常量指针常量是指向常量的指针常量,同时具备常量指针和指针常量的特点。 - **示例**:`const int *const ip4;` - **解释**:`ip4`指向的地址固定,同时指向的内容也不允许修改。这意味着既不能修改`ip4...

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

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

    C语言程序设计(第2版)-2期 拓展知识2-1 const常量.pdf

    此外,`const`还可以用于定义常量指针和指针常量,这是C/C++中非常重要的特性,它可以帮助我们更好地控制内存和数据的访问权限。 总的来说,`const`常量在C语言中扮演着重要的角色,它能帮助程序员编写更加安全、...

    Const 用法小结

    - `const int* a` 和 `int const *a`:指针指向的内容为常量,不可修改。 - `int* const a`:指针本身是常量,但其指向的内容可以修改。 - `const int* const a`:指针本身和指向的内容都是常量,都不允许修改。 ...

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

    在C++编程语言中,`const`关键字被用来声明常量或者只读对象,它可以用于声明常量指针和指针常量,这两者在概念上有着显著的区别。理解这些概念对于编写安全、高效的代码至关重要。 首先,让我们讨论`const`的一些...

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

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

    CONST指针指针

    这种情况是`const`同时修饰指针和指针所指的变量,两者都不能改变。例如: ```c const int* const pi = &a; // pi和*a都是常量 *pi = j; // 错误,*pi是常量,不能修改 pi = &j; // 错误,pi是常量,不能改变 ...

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

    然而,有时候我们希望限制对指针的操作,这时就需要用到指针常量和常量指针。理解这两者的区别对于编写安全、高效的代码至关重要。 1. 指针常量与常量指针的概念 指针常量是指指针变量本身是常量,即指针的值...

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

    1. **常量指针**:当`const`修饰的是指针本身时,这意味着指针变量不能改变其指向的地址。例如: ```cpp const char *s; // 常量指针 ``` 在这个例子中,`s`是一个指向`char`的常量指针,意味着`s`的值(即它...

Global site tag (gtag.js) - Google Analytics