`

【C和指针】const指针

 
阅读更多

一,入门

const 指针

指针指向的内容不能变,指针可以改变指向

指向const的指针

指针不可以改变指向,指针指向内容可以变

#include "stdio.h" 

int main() 
{ 
   //const 指针 (指针指向的内容不能变,指针可以改变指向) 
	int a = 5;   
	int b = 6;   
	const int *ptr = &a;   
	*ptr = 8; //error   
	ptr = &b; //ok;   
	
	//指向const的指针 (指针不可以改变指向,指针指向内容可以变)
	int a = 5;   
	int b = 6;   
	int * const ptr = &a;   
	*ptr = 8; //ok   
     ptr = &b; //error
} 

二,深度解析

大致说来其可分为三种情况: const修饰指针,const修饰引用,const修饰指针的引用.
const修饰指针
const修饰指针本身
const修饰指针所指的变量(或对象)
const修饰指针本身和指针所指的变量(或对象)
1)const修饰指针本身
这种情形下,指针本身为常量,p不可改变,任何修改指针本身的行为都是非法的.

例如:

const int a = 1; 
const int b = 2; 
int i = 3; 
int j = 4; 
int* const pi = &i; //ok, pi的类型为int* const , &i的类型为int* const 
int* const pi = &a; //error, pi的类型为int* const, &a的类型为const int* const 
pi = &j; //error, 指针是常量,不可变 
*pi = a; //ok, *pi并没有限定是常量 ,可变 


由此看出,pi是常量,常量在初始化和赋值时,类型必须严格一致。也就是const修饰指针本身时,=号两边的变量类型必须严格一致,否则不能匹配。
2)const修饰指针指向的变量(或对象)
此种情形下,通过间接引用指针不可改变变量的值,假设指针为p,则*p不可变,下面以例子说明:

const int *pi = &a; //也可以写成 int const *pi = &a; 
        const int *pi = &i; //ok ,pi可赋值常量的地址,又可赋变量的地址 
         const int *pi1 = &a; 
        const int *pi = pi1; //ok 
        *pi = j; //error,*pi 不可变,不能更改指针的间接引用形式 
         pi = &j; //ok,pi可变 
         pi = &b; //ok,pi可变 
         pi++; //ok 
         --pi; //ok 

3)const修饰指针本身和指针所指的变量(或对象)
设有指针p,此种情形下,p和*p都不可变.举例如下:

const int* const pi = &a; //or int const* const pi = &a; 
//将const pi看作一体,就与(2)所述相同,只是要求pi必须为const,正如上所说,=号两边的类型不必严格匹配,但必须含有int*, &a的类型为const int* const,含有int*, 所以可以赋值。 
const int* const pi = &i; //ok, &i类型为int* const,含有int*, 可赋值。 
const int *pi1 = &j; 
const int *const pi = pi1; //ok,  pi1类型为int* 
pi = &b; //error, pi不可变 
pi = &j; //error, pi不可变 
*pi = b; //error, *pi不可变 
*pi = j; //error, *pi不可变 
pi++; //error ,pi不可变 
++i; //ok, =号右边的变量(或对象)与所修饰的变量无关 
a--; //error, a为const 


这种情况,跟以上两种情形有联系。对const int* const pi = &a;我们可以这样看:const int*( const pi )= &a;(仅仅是表达需要),将const pi看作一体,就与上述分类(2)符合。只要含有int*便可.

const修饰引用
这种情况比较简单,没有象修饰指针那样繁复,因为引用和引用对象是一体的,所以引用被const修饰只有一种类型。
const修饰引用,引用本身不可变,但引用的变量(或对象)可以改变.例如:

const int& ri = a; //or int const & ri = a; ok, ri 本身是常量,引用不区分类型 
const int& ri = i; //ok,引用不区分类型 
ri++; //error, ri为常量,不可变 
i++; //ok,=右边的变量与引用无关 
ri=b; //error, ri为常量 
i=j; //ok,=右边的变量与引用无关 
int & const ri = i; //error,不存在这种形式,没有意义 


const修饰指针的引用
引用只是个别名,这里与修饰指针类似,又分为三种情况:
(1)
先给个例子:
const int *pi = &a;
const int *&ri = pi; //or int const *&ri = pi;
引用是引用对象的别名,正因为如此,ri是pi的别名,所以ri的类型必须与pi完全一致才行。这里pi的类型为int*,ri的类型也为int*,赋值可行。若const int *&ri = &a;正不正确?分析一下就知晓。ri类型为int*,&a的类型则为const int* const不匹配。
const int *&ri = &i; //error,类型不匹配,一为int*,一为int* const
ri = &a; //ok
ri = &i; //ok
const int *pi1=&a;
const int *pi2=&i;
ri = pi1; //ok
ri = pi2; //ok
*ri = i; //error
*ri = a; //error
注意这与1-(2)的区别.
(2)
用例子说明:
int *const &ri = &i;//去掉ri左边的&号,则为int *const ri,因为ri是别名,故ri的类型应与赋值的数类型一致,ri类型为int *const,&i为int *const,可以这么做.
int *const &ri = pi; //error,类型不合,一为int *const ,一为int *
int *const &ri = &a; //error,类型不合,一为int *const,一为const int* const
(*ri)++; //ok
i++; //ok
ri = &i; //error
这种情况下,ri为常量,不可更改.
(3)
用例子说明:
const int* pi = &j;
const int* const &ri = pi; //or int const * const &ri = pi;ok
const int* const &ri = &i; //ok
ri是pi的别名,pi的类型应与ri一致。拿掉&,得const int* const ri ,把const ri看作一体,很容易得出ri的类型信息,就象前面2-(3)所讨论的一样,可以得到赋给ri的只要含有类型int* 即可。pi的类型为int*,&i的类型为int* const ,可以这么做.
const int * const &ri = &a; //ok
ri++; //error
*ri = 6; //error

分享到:
评论

相关推荐

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

    值得注意的是,const指针在C++中有着几乎相同的作用和用法,这使得了解const指针在C语言中的应用对于学习C++同样有帮助。 通过上述知识,我们可以了解到,要想灵活运用指针和const关键字,必须彻底理解指针变量本身...

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

    ### 函数指针和指针函数的区分及应用 #### 函数指针的理解与使用...通过以上介绍,我们可以看出函数指针和指针函数有着本质的区别,同时正确使用 `const` 可以帮助我们更好地控制程序的行为,提高程序的安全性和效率。

    const与指针的关系

    ### const与指针的关系 #### 一、const与指针的基本分类 ...总之,理解和掌握`const`与指针之间的关系对于编写高效、安全的C/C++程序至关重要。通过本文的分析,希望读者能够更好地理解和运用这些概念。

    CONST指针指针

    总之,理解和熟练使用`const`修饰指针是C语言编程中的关键技巧之一。它能帮助开发者编写更加安全、可预测的代码,并且在多人协作的项目中减少错误和误解。熟练掌握`const`在不同情况下的用法,将有助于提升C语言编程...

    c语言const用法小结

    const 是 C 语言中一种非常重要的关键字,它可以用来修饰变量、指针、函数返回值、函数参数和成员函数等。 const 的使用可以提高代码的安全性和可读性,本文将对 const 的各种用法进行总结。 1. const 常量 const ...

    精选C语言指针资料大全

    - const指针和指针const:理解const关键字在指针上下文中的含义,包括const修饰指针和指针所指对象的区别。 - 指针安全:讨论指针未初始化、空指针、野指针等问题,以及如何避免这些潜在的错误。 3. **彻底搞定C...

    C语言中const使用说明

    总结,`const`在C语言中扮演着至关重要的角色,它可以用于声明常量、创建只读变量、修饰指针、函数参数以及成员函数,帮助我们编写更安全、更清晰的代码。理解和正确使用`const`是成为熟练C程序员的关键一步。

    C语言练习(指针)及答案

    ### C语言指针知识点解析 #### 一、基础指针表达式求值 根据题目描述,我们有以下信息: - `ints` 数组在内存中的起始位置是 100,每个整型值和指针占用 4 个字节。 - `ints` 数组初始化为 `{10,20,30,...,200}`。...

    c语言之const用法

    const 关键字是一个非常重要的概念在 C 语言中,它可以用来限定变量、指针和函数的行为,让程序更加安全和可靠。下面我们来详细介绍 const 的用法和相关知识点。 1. const 的普通用法 const int n = 10; 这里,n ...

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

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

    const 指针

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

    指针常量与常指针CONST

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

    c/c++语言中const的用法,const 定义变量,指针的用法和不同

    在本文中,我们将详细介绍 C/C++ 语言中 const 的用法,包括 const 定义变量、指针的用法和不同。 首先,让我们来看一个例子: ```c const int a = 10; int *pa = &a; *pa = 20; printf("%d\n", *pa); ``` 在上面的...

    C语言中const定义常量

    为了更好地理解和运用C语言中的特性,掌握`const`关键字的使用变得尤为重要。本文将详细介绍如何在C语言中使用`const`关键字来定义常量,并探讨其背后的原理。 #### 二、`const`关键字概述 `const`关键字在C语言中...

    c和指针 课本源代码及课后答案[完整版]

    《C和指针》是一本经典的C语言编程教材,它深入浅出地讲解了C语言中的指针概念及其应用。本书旨在帮助读者掌握C语言中指针的强大功能,提升编程能力。提供的源代码和课后答案是学习过程中的重要参考资料,它们能帮助...

    C语言中const与指针使用方法总结

    // 错误:尝试改变const指针 ``` 在这个情况下,`pc`和`c`都是不可变的,任何试图修改它们的尝试都会导致编译错误。 4. `const`修饰的指针解引用: 有时,`const`关键字也可以放在星号的后面,如`const * int ...

    C语言指针详解chm格式

    《C语言指针详解》是一本深入探讨C语言指针的资源,以CHM(Microsoft的帮助文件格式)呈现,方便用户查阅和学习。该压缩包使用RAR 3.8版本进行压缩,无需密码即可解压,为学习者提供了便捷的访问路径。 在C语言中,...

    C语言对于指针的最详细权威解析,能够完全理解c语言中最难理解的指针

    《彻底搞定C指针》可能包含更具体的指针使用技巧和实践案例。而《内存指针字符串》和《排错》的PPT则可能涉及字符串处理、内存管理以及如何通过指针进行调试和优化。 学习并熟练运用指针,是成为C语言高手的...

    c语言const的用法详解

    `const`关键字是C语言中的一个非常重要的概念,主要用于声明不可变的变量或指针。它可以帮助程序员更好地控制程序的行为,减少错误的发生,并提高代码的可读性和维护性。本文档通过一系列的例子详细介绍了`const`在...

    C语言CONST的使用

    在C语言中,const是一个非常重要的关键字,它被用于声明一个变量是常量,即其值在初始化之后就不能被改变。常量可以是整型、浮点型、字符型等多种基本数据类型,也可以是复合类型如指针或数组等。使用const关键字...

Global site tag (gtag.js) - Google Analytics