易犯错让人混淆的指针与Const
2015-10-28 19:52
309 查看
易犯错让人混淆的地方,首先看看下面的几种定义:
如果我们定义的是一个指针是什么情况呢?
然后我们看看下面的情况
最后看一种情况:
所以综上的情况:可以得知
在指针(*)左边使用const修饰,表示指向的元素值不能改
在指针(*)右边使用const修饰,表示指针的地址不能改
#include<stdio.h> #include<stdlib.h> void main() { //这两种是一样的意思,都表示定义一个常量num1、num2不能被修改 int const num1 = 10; const int num2 = 20; //num1 = 1; num1、和num2都不能被修改 //num2 = 2; getchar(); }
如果我们定义的是一个指针是什么情况呢?
#include<stdio.h> #include<stdlib.h> void main() { //这两种是一样的意思,都表示定义一个常量num1、num2不能被修改 int num1 = 10; int num2 = 20; int const *p1; const int *p2; //这里p1、p2都可以赋值新地址,那么表示自身不是一个常量 p1 = &num1; p1 = &num2; p2 = &num2; p2 = &num1; //这里给p1、p2指向的单元重新赋值会报错,如下图 //表明这时候的他们都能指向任意的地址,但是不能修改 //*p1 = 1; //*p2 = 2; //所以这种声明是等价的 getchar(); }
然后我们看看下面的情况
#include<stdio.h> #include<stdlib.h> void main() { //这两种是一样的意思,都表示定义一个常量num1、num2不能被修改 int num1 = 10; int num2 = 20; int* const p1 = &num1; //这个时候修改p1指向的地址,会报错,说 p1是一个常量。 //p1 = &num2; //而此时p1可以修改指向单元的数据 *p1 = 1; //因此,这种方式声明表示的是 定义一个指向整型数据的一个常量指针 //自己的地址不能被修改,但是指向的单元数据可以被修改 getchar(); }
最后看一种情况:
#include<stdio.h> #include<stdlib.h> void main() { //这两种是一样的意思,都表示定义一个常量num1、num2不能被修改 int num1 = 10; int num2 = 20; //这里定义的int const 和 const int 在前面的例子中表示的一样效果 //所以有两种定义方式 int const * const p1 = &num1; const int * const p2 = &num2; //此时我们发现 我们修改p1、p2的地址的指向的数据都不可以 //p1 = &num2; //p2 = &num1; //*p1 = 2; //*p2 = 1; //因此这种方式定义的 表示的是指向常量的常量指针 getchar(); }
所以综上的情况:可以得知
在指针(*)左边使用const修饰,表示指向的元素值不能改
在指针(*)右边使用const修饰,表示指针的地址不能改
相关文章推荐
- LeetCode 117: Populating Next Right Pointers in Each Node II
- CSS边框素材
- 求一个数二进制中1的个数
- pythony文件操作编码问题
- c# 5.0——async 和 await
- nginx 负载均衡
- 驱动的模块申明
- oracle 卡住不动
- linux基础5
- 类似于IOS弹出底部对话框
- sql中实现split()功能
- Gson 源码分析 总结
- 数组课后作业
- (转)java之多线程
- Android中实现两次点击返回键退出本程序
- 数据库SQL语句练习题
- 智能车学习(十)——MMA8451加速度计的使用
- [31]Next Permutation
- 大规模虚拟存储---SAN初识
- Java基础篇—IO操作