一,入门
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
分享到:
相关推荐
值得注意的是,const指针在C++中有着几乎相同的作用和用法,这使得了解const指针在C语言中的应用对于学习C++同样有帮助。 通过上述知识,我们可以了解到,要想灵活运用指针和const关键字,必须彻底理解指针变量本身...
### 函数指针和指针函数的区分及应用 #### 函数指针的理解与使用...通过以上介绍,我们可以看出函数指针和指针函数有着本质的区别,同时正确使用 `const` 可以帮助我们更好地控制程序的行为,提高程序的安全性和效率。
### const与指针的关系 #### 一、const与指针的基本分类 ...总之,理解和掌握`const`与指针之间的关系对于编写高效、安全的C/C++程序至关重要。通过本文的分析,希望读者能够更好地理解和运用这些概念。
总之,理解和熟练使用`const`修饰指针是C语言编程中的关键技巧之一。它能帮助开发者编写更加安全、可预测的代码,并且在多人协作的项目中减少错误和误解。熟练掌握`const`在不同情况下的用法,将有助于提升C语言编程...
const 是 C 语言中一种非常重要的关键字,它可以用来修饰变量、指针、函数返回值、函数参数和成员函数等。 const 的使用可以提高代码的安全性和可读性,本文将对 const 的各种用法进行总结。 1. const 常量 const ...
- const指针和指针const:理解const关键字在指针上下文中的含义,包括const修饰指针和指针所指对象的区别。 - 指针安全:讨论指针未初始化、空指针、野指针等问题,以及如何避免这些潜在的错误。 3. **彻底搞定C...
总结,`const`在C语言中扮演着至关重要的角色,它可以用于声明常量、创建只读变量、修饰指针、函数参数以及成员函数,帮助我们编写更安全、更清晰的代码。理解和正确使用`const`是成为熟练C程序员的关键一步。
### C语言指针知识点解析 #### 一、基础指针表达式求值 根据题目描述,我们有以下信息: - `ints` 数组在内存中的起始位置是 100,每个整型值和指针占用 4 个字节。 - `ints` 数组初始化为 `{10,20,30,...,200}`。...
const 关键字是一个非常重要的概念在 C 语言中,它可以用来限定变量、指针和函数的行为,让程序更加安全和可靠。下面我们来详细介绍 const 的用法和相关知识点。 1. const 的普通用法 const int n = 10; 这里,n ...
C++ 编程语言中,const 指针和指向const的指针是两个容易混淆的概念,但它们有着不同的定义和使用场景。在本文中,我们将详细分析 C++ const 指针和指向const的指针,帮助读者更好地理解和学习这两个概念。 const ...
<类型> const * <指针变量> 或 const <类型> * <指针变量> 2、常量指针: <类型> * const <指针变量> 3、指向常量的常量指针: <类型> const * const <指针变量> 或 const <类型> * const <指针变量>
此程序是指针常量、常量指针改变对应值方法
在本文中,我们将详细介绍 C/C++ 语言中 const 的用法,包括 const 定义变量、指针的用法和不同。 首先,让我们来看一个例子: ```c const int a = 10; int *pa = &a; *pa = 20; printf("%d\n", *pa); ``` 在上面的...
为了更好地理解和运用C语言中的特性,掌握`const`关键字的使用变得尤为重要。本文将详细介绍如何在C语言中使用`const`关键字来定义常量,并探讨其背后的原理。 #### 二、`const`关键字概述 `const`关键字在C语言中...
《C和指针》是一本经典的C语言编程教材,它深入浅出地讲解了C语言中的指针概念及其应用。本书旨在帮助读者掌握C语言中指针的强大功能,提升编程能力。提供的源代码和课后答案是学习过程中的重要参考资料,它们能帮助...
// 错误:尝试改变const指针 ``` 在这个情况下,`pc`和`c`都是不可变的,任何试图修改它们的尝试都会导致编译错误。 4. `const`修饰的指针解引用: 有时,`const`关键字也可以放在星号的后面,如`const * int ...
《C语言指针详解》是一本深入探讨C语言指针的资源,以CHM(Microsoft的帮助文件格式)呈现,方便用户查阅和学习。该压缩包使用RAR 3.8版本进行压缩,无需密码即可解压,为学习者提供了便捷的访问路径。 在C语言中,...
《彻底搞定C指针》可能包含更具体的指针使用技巧和实践案例。而《内存指针字符串》和《排错》的PPT则可能涉及字符串处理、内存管理以及如何通过指针进行调试和优化。 学习并熟练运用指针,是成为C语言高手的...
`const`关键字是C语言中的一个非常重要的概念,主要用于声明不可变的变量或指针。它可以帮助程序员更好地控制程序的行为,减少错误的发生,并提高代码的可读性和维护性。本文档通过一系列的例子详细介绍了`const`在...
在C语言中,const是一个非常重要的关键字,它被用于声明一个变量是常量,即其值在初始化之后就不能被改变。常量可以是整型、浮点型、字符型等多种基本数据类型,也可以是复合类型如指针或数组等。使用const关键字...