C语言--const修饰指针解析
2013-07-28 21:30
330 查看
这种例子在我们平时编程时可能会很少用,但是在面试时被问的可能性就很大了。
用const修饰指针,常见的情况可以分为四种:
1.const int *p; // p 可变,p 指向的对象不可变
2.int const *p; // p 可变,p 指向的对象不可变
3.int *const p; // p 不可变,p 指向的对象可变
4.const int *const p; //指针p 和p 指向的对象都不可变
可以看到,这四种情况面对的问题是p的值和p指向的值是否可以修改。
下面,我给出一个例子,在例子中已经给出了详细的注释:
这下是不是明白了很多,但是,这样不好记啊,好吧,我现在讲下应该怎么去记下这些东西。
其实,我们需要做的并不是刻意记住每一种写法代表的是什么,这样太累了,我们需要做的是好好观察:
这里,观察的方式是“就近原则”,是观察 const 和谁的位置比较近,因为 const 修饰的不能改变的变量,所以,离 const 近,那么它就是不可改变的变量。
1.const int *p; // p 可变,p 指向的对象不可变
这里,const 和 *p 最近 ,所以,*p 就是不可改变的,也就是值是不可改变的,p 的地址是可以改变的。
2.int const *p; // p 可变,p 指向的对象不可变
这里,const 还是和 *p 最近,所以,是和第一种情况是一样的。
3.int *const p; // p 不可变,p 指向的对象可变
这里,const 和 p 最近,所以,情况就改变了,正好和前两种情况相反,p 的地址是不能改变的,而p 指向的对象是可以变的。
4.const int *const p; //指针p 和p 指向的对象都不可变
这下就简单的,const和 *p 和 p 都是最近的,所以,这两个都是不能改变的。
说完了这些,是不是对const修饰指针很明白了!
用const修饰指针,常见的情况可以分为四种:
1.const int *p; // p 可变,p 指向的对象不可变
2.int const *p; // p 可变,p 指向的对象不可变
3.int *const p; // p 不可变,p 指向的对象可变
4.const int *const p; //指针p 和p 指向的对象都不可变
可以看到,这四种情况面对的问题是p的值和p指向的值是否可以修改。
下面,我给出一个例子,在例子中已经给出了详细的注释:
#include <iostream> using namespace std; int main(void) { //给出两个值用于测试 int testValue1 = 10; int testValue2 = 15; //这个代表 p 的值可以改变, *p 的值不能改变 const int *p = &testValue1; p = &testValue2; //可以给 p 赋其他的地址 //*p += 1; //错误,*p 的值不能改变 //和 const int *p 是一个意思 int const *p2 = &testValue1; p2 = &testValue2; //这个代表 p3 指向的地址是不能改变的,但是 *p3 是可以改变的 int *const p3 = &testValue1; //p3 = &testValue2; //错误,地址不能改变 *p3 += 1; //这个代表 p4 指向的地址不能改变,且那个值也不能改变 const int *const p4 = &testValue1; }
这下是不是明白了很多,但是,这样不好记啊,好吧,我现在讲下应该怎么去记下这些东西。
其实,我们需要做的并不是刻意记住每一种写法代表的是什么,这样太累了,我们需要做的是好好观察:
这里,观察的方式是“就近原则”,是观察 const 和谁的位置比较近,因为 const 修饰的不能改变的变量,所以,离 const 近,那么它就是不可改变的变量。
1.const int *p; // p 可变,p 指向的对象不可变
这里,const 和 *p 最近 ,所以,*p 就是不可改变的,也就是值是不可改变的,p 的地址是可以改变的。
2.int const *p; // p 可变,p 指向的对象不可变
这里,const 还是和 *p 最近,所以,是和第一种情况是一样的。
3.int *const p; // p 不可变,p 指向的对象可变
这里,const 和 p 最近,所以,情况就改变了,正好和前两种情况相反,p 的地址是不能改变的,而p 指向的对象是可以变的。
4.const int *const p; //指针p 和p 指向的对象都不可变
这下就简单的,const和 *p 和 p 都是最近的,所以,这两个都是不能改变的。
说完了这些,是不是对const修饰指针很明白了!
相关文章推荐
- C语言--const修饰指针解析
- C语言--const修饰指针解析
- C语言里的const和指针修饰关系
- const修饰的指针的用法解析
- const修饰的双重指针赋值解惑
- C经典 const与指针解析
- 程序员面试(3):关于const修饰指针的情况
- C语言中的声明解析规则——数组,指针与函数
- C语言中auto,register,static,const,volatile的区别详细解析
- C语言的指针类型详细解析
- 程序猿之---C语言细节28(const变量初始化、数组大小用const变量细节、const变量与#define宏、volatile修饰)
- C语言 内存分配 地址 指针 数组 参数 实例解析
- C语言指针概念全面解析
- 带有const修饰的指针解读
- 不一样的C语言-const修饰的变量
- const修饰指针和引用的用法
- C语言修饰词之const
- C语言中auto,register,static,const,volatile的区别详细解析
- 总结函数的参数,指针参数及const修饰的情况
- 基于C语言中野指针的深入解析