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 *pa和int *const pa这两者,
前者中,const直接修饰*(不考虑int,因为类型在这里是没影响的),说明*(解引用)这种行为具有常量性,即“不能靠解引用改变它指向的对象的值”,即指向常量的指针。
后者中,const直接修饰pa,说明pa本身的值具有常量性,即常量指针。
或者也可以这样来记忆:
const int a; // const常量
const int *a; //指向常量的指针
int *const a=&n; //常量指针
你在纸上按顺序写下以上三行,记住它们的注释长度:短长短,
分别对应着:const常量、指向常量的指针、常量指针这三种,应该就不会混淆了。
个人认为以上记忆法比《Effective ++》条款21中推荐的划线分左右法更好记。
另1:也有教材反过来把上述第二者称呼为“常量指针”,第三者称呼为:“指针常量”,相对来说更容易让人混淆,大家还是只记住上面的那种称呼法就好。
另2:const和typedef在一起时容易让人陷入陷阱,具体见《typedef的用途和陷阱》。
相关推荐
这里 `chrPtr` 是一个指向字符数组的常量指针,可以通过重新赋值让 `chrPtr` 指向其他地址,但是不能通过 `chrPtr` 来修改它所指向的数据。 ### 示例代码解析 以下面的代码为例: ```c #include int f(int x, ...
根据给定文件的信息,我们可以提炼出关于“常量指针和指针常量”的相关知识点。下面将对这些概念进行详细的解析。 ### 常量指针与指针常量的概念 #### 1. 常量指针(const int *) **定义**:`const int *p` 这种...
C++ 编程语言中,const 指针和指向const的指针是两个容易混淆的概念,但它们有着不同的定义和使用场景。在本文中,我们将详细分析 C++ const 指针和指向const的指针,帮助读者更好地理解和学习这两个概念。 const ...
在C/C++编程语言中,理解“常量指针”和“指针常量”的概念至关重要,因为它们涉及到了指针变量的限制和...在编写涉及内存管理和指针操作的复杂程序时,正确使用常量指针和指针常量能显著提高代码的可读性和可靠性。
而在指针的基础上,衍生出了两种特殊的指针类型——**指针常量**和**常量指针**。 1. **常量指针**: - **定义**:指向常量的指针,这种类型的指针所指向的内容是不允许被改变的。换句话说,一旦指针指向了一个...
3. **指向常量的常指针(Const Pointer to Const)**: - 定义格式:`const int *const a = &b;` - 这种类型的指针表示指针本身及其指向的内容都是常量,即既不能改变指针的指向,也不能通过该指针修改其指向的...
通过上述知识,我们可以了解到,要想灵活运用指针和const关键字,必须彻底理解指针变量本身和指针所指向的内容之间的区别,以及它们是如何通过const关键字得到保护的。正确地使用const指针可以有效地防止程序中出现...
在这种情况下,`q`是指向整型变量的常量指针,即`q`本身的值(即它指向的地址)不能被改变,但可以通过`q`修改其指向的数据。 #### 五、`#define`预处理指令 除了`const`关键字外,C语言还提供了`#define`预处理...
本文将从一个新手的角度出发,详细介绍“指针常量”和“常量指针”的概念及其区别,力求简单易懂。 ### 指针常量 **指针常量**(Pointer to constant)是一种特殊的指针类型,其指向的数据不能被修改。也就是说,...
- **定义**:常量指针常量是指向常量的指针常量,同时具备常量指针和指针常量的特点。 - **示例**:`const int *const ip4;` - **解释**:`ip4`指向的地址固定,同时指向的内容也不允许修改。这意味着既不能修改`ip4...
在这篇文章中,我们将解释常量指针,指针常量,const pointer to const(ps:楼主以为这可以翻译成指向常量的常量指针)的区别 常量指针 让我们先来理解什么是常量指针。常量指针是指指针指向的地址是常量。换句话说...
此外,`const`还可以用于定义常量指针和指针常量,这是C/C++中非常重要的特性,它可以帮助我们更好地控制内存和数据的访问权限。 总的来说,`const`常量在C语言中扮演着重要的角色,它能帮助程序员编写更加安全、...
- `const int* a` 和 `int const *a`:指针指向的内容为常量,不可修改。 - `int* const a`:指针本身是常量,但其指向的内容可以修改。 - `const int* const a`:指针本身和指向的内容都是常量,都不允许修改。 ...
在C++编程语言中,`const`关键字被用来声明常量或者只读对象,它可以用于声明常量指针和指针常量,这两者在概念上有着显著的区别。理解这些概念对于编写安全、高效的代码至关重要。 首先,让我们讨论`const`的一些...
对于指针和常量,有以下三种形式都是正确的: 代码如下:const char * myPtr = &char_A;//指向常量的指针char * const myPtr = &char_A;//常量的指针const char * const myPtr = &char_A;//指向常量的常量指针下面...
这种情况是`const`同时修饰指针和指针所指的变量,两者都不能改变。例如: ```c const int* const pi = &a; // pi和*a都是常量 *pi = j; // 错误,*pi是常量,不能修改 pi = &j; // 错误,pi是常量,不能改变 ...
然而,有时候我们希望限制对指针的操作,这时就需要用到指针常量和常量指针。理解这两者的区别对于编写安全、高效的代码至关重要。 1. 指针常量与常量指针的概念 指针常量是指指针变量本身是常量,即指针的值...
1. **常量指针**:当`const`修饰的是指针本身时,这意味着指针变量不能改变其指向的地址。例如: ```cpp const char *s; // 常量指针 ``` 在这个例子中,`s`是一个指向`char`的常量指针,意味着`s`的值(即它...