C++ 指针与const的组合复习
2016-03-25 20:59
190 查看
一const变量
二const与指针
1指向常量的指针
2常指针
3指向常量的常指针
三总结
因为最近在笔试的时候遇到C++中的指针使用,头疼的很。今天刚好又重新温固了一下C++的指针和const的组合,现在将看到的知识重新梳理一下。
1. const与一般的变量(除指针)
2. const与指针(比较复杂)
3. const与函数参数和返回值
4. const与类成员(数据成员和函数成员)
其实第一种和第三种、第四种都比较好理解,就是被修饰的值是一个常量,在编译期间就确定了的,在运行期间是无法改变的。
照理来说,第二种,const与指针也是这个关系,只是说一方面指针和const的声明比较让人眼花缭乱;另外方面就是指针比较特殊,它本身就是一个变量,变量内部装的是另一个变量的“地址”,地址呢本来就是一个固定的值,所以就比较混乱。
注意: * 是间接取地址符,表示将该指针所存储的地址的内容取出来。
const与指针的组合有以下三种:
上面的形式中,以 * 间接取址符为边界,左边的const(与int的位置左右都可以)修饰的是所指向的变量是否是常量,右边的const修饰的是指针是否是常量。
总结来说:指针本身是一个变量,所指向的对象是另一个变量。因此左边的const修饰的是所指对象的可变性,右边的const修饰的是指针的可变性。
理解了上面那句话,我们再看看下面的伪代码:
上面的例子说明了常量的不可变性。下面再看看指针的可变性:
通过上面两段伪代码的说明,我们把指针变量和对象变量分开来看的话,那么就会很清晰了。两者并不干扰对方的规则,都是遵从const下的各自的规则。
我们来看一看指针的不可变:
再来看一看变量的可变:
看了上面两个对比之后,其实也清晰了,这里的const是对指针加以限定的。它限定了指针里面的内容是一个常量,是不能被重新赋值的。在开始定义(编译期间)的时候就已经定下来了。
我们来看看它的定义代码:
二const与指针
1指向常量的指针
2常指针
3指向常量的常指针
三总结
因为最近在笔试的时候遇到C++中的指针使用,头疼的很。今天刚好又重新温固了一下C++的指针和const的组合,现在将看到的知识重新梳理一下。
一、const变量
我们知道,在C++中,const是经常使用到的一个关键字。因为使用它可以提高系统的安全性和程序员编程的可靠性。被const修饰的符号说明是常量,即不可变的。一般来说const在C++中的使用有以下的组合:1. const与一般的变量(除指针)
2. const与指针(比较复杂)
3. const与函数参数和返回值
4. const与类成员(数据成员和函数成员)
其实第一种和第三种、第四种都比较好理解,就是被修饰的值是一个常量,在编译期间就确定了的,在运行期间是无法改变的。
照理来说,第二种,const与指针也是这个关系,只是说一方面指针和const的声明比较让人眼花缭乱;另外方面就是指针比较特殊,它本身就是一个变量,变量内部装的是另一个变量的“地址”,地址呢本来就是一个固定的值,所以就比较混乱。
二、const与指针
对于这个问题,我觉得首先要把指针变量和对象变量搞清楚。指针本身是一个变量,对象本身是一个变量,两者内存空间是不一样的,只是说指针通过存储对象变量的地址,然后将两者联系起来。弄清楚了这个,那么理解起来就会方便很多,也就可以分开看了。注意: * 是间接取地址符,表示将该指针所存储的地址的内容取出来。
int a = 10; int * p = a; printf("%d , %d",p,&a); //输出的是同一个地址 printf("%d , %d",*p,a); //输出的是同一个数 printf("%d",&p); //输出的是p的地址
const与指针的组合有以下三种:
(1):指向常量的指针———— const int *p; (2):常指针 ———— int * const pc = "a"; (3):指向常量的常指针———— int const * const pc = "a";
上面的形式中,以 * 间接取址符为边界,左边的const(与int的位置左右都可以)修饰的是所指向的变量是否是常量,右边的const修饰的是指针是否是常量。
总结来说:指针本身是一个变量,所指向的对象是另一个变量。因此左边的const修饰的是所指对象的可变性,右边的const修饰的是指针的可变性。
(1)指向常量的指针
这里的const限定的是所指向的对象是一个常量。而该处的指针是可以指向常量也可以指向变量的,即指针本身没有被限定。理解了上面那句话,我们再看看下面的伪代码:
int const a = 10;//常量在申明的同时就要初始化 int const * p = a; //此处p就是一个指向常量的指针 char * p1 = "abcde"; //虽然没有申明const,因为"abcde"字符串本身就是常量,存储在常量区,因此这里的p也是指向常量的指针。 *p = 3; //错误,*p是一个常整型,因此不能修改; *p1 = "aqw"; //错误,*p是一个常字符串常量,不能修改;
上面的例子说明了常量的不可变性。下面再看看指针的可变性:
char * p = "avcsd";//申明了一个指向常量字符串的指针; char a[] = "asdfw";//数组中的字符串是一个可变字符串,存在栈中 p = a; //改变了p的指向,p指向了一个新的字符串
通过上面两段伪代码的说明,我们把指针变量和对象变量分开来看的话,那么就会很清晰了。两者并不干扰对方的规则,都是遵从const下的各自的规则。
(2)常指针
这里的常指针就是对指针来说的了,该指针是一个常量,它在定义的时候就要初始化,但是它指向的对象就没有规定,可以是常量也可以是变量。也就是说,指针是不能变的,但是对象是可以变的。我们来看一看指针的不可变:
int * const p = 3; //该常指针,指向了一个整型数3 p = 4; //错误,不能修改指针的内容,即指针指向的地址不能被修改
再来看一看变量的可变:
int a = 3; //一个可变的整型 const int b = 4; //一个不可变的整型; int * const p = a; //这里常指针p指向了一个可变的整型 int * const p1 = b; //这里常指针p1指向了一个常量不可变的整型
看了上面两个对比之后,其实也清晰了,这里的const是对指针加以限定的。它限定了指针里面的内容是一个常量,是不能被重新赋值的。在开始定义(编译期间)的时候就已经定下来了。
(3)指向常量的常指针
理解了上面两个之后,这里也就很好理解了。顾名思义,就是指针和对象两者都是一个常量,也就是两着都不能被改变,都需要在编译期确定。我们来看看它的定义代码:
const char * const pc = "asdg"; //前面的const可以不要,因 //为"asdg"字符串本就是一个常量。 pc[3] = 'a'; //错误,指针指向的是常量,p[3]是'g','g'是不可修改的 pc = "sdfw"; //错误,指针是一个常量,其内容(即指向)是不能改变的
三、总结
总结一下,对于const和指针,只要把指针变量和对象变量分开看,各自被const修饰,那么就不会混淆。相关文章推荐
- C++ 类成员函数继承(virtual、非virtual)
- C++中头文件(.h)和源文件(.cpp)都应该写些什么
- C++书籍
- 最近研究了一下C++里面的const
- 自己动手封装VxWorks下C++基础库
- 设计模式--模板方法模式C++实现
- C++中inline函数
- 与LSGO一起学“第2章 做一个简短的C++程序(2.5 重名问题)”
- 与LSGO一起学“第2章 做一个简短的C++程序(2.6 注释)”
- 与LSGO一起学“第2章 做一个简短的C++程序(2.4 iostream与iostream.h的区别)”
- 与LSGO一起学“第2章 做一个简短的C++程序(2.3 std::介绍)”
- 与LSGO一起学“第2章 做一个简短的C++程序(2.2 输出语句的使用)”
- 与LSGO一起学“第2章 做一个简短的C++程序(2.1简单的屏幕输出小程序)”
- C语言:单链表实现(二) 就地逆置,就地归并
- C++学习之:括号匹配与栈的使用
- c语言字符串-常用操作(3) 字符串 翻转
- 设计模式--抽象工厂模式C++实现
- C++练习题目记录
- C++中虚继承的作用
- c++:改造cmdline用于MSVC下的命令行参数解析