指针常量与常量指针的区别
2014-02-19 14:35
239 查看
1. 名词解释
常量指针:即指针是常量形式,它首先应该是一个指针。表示一个指向常量的指针,它所指向的地址的内容是不可修改的。具体地,int a = 10; int b = 20; const int* p = &a; p = &b;// ok *p = b;//error!
指针常量:常量是指针形式,它首先是一个常量。他是不可改变地址的指针,但是可以对它指向的内容进行修改。具体地,int a = 10; int b = 20 ; int* const p = &a; p = &b; //error! *p = b;// ok!
2. 具体使用形式有四种
1) char* const p1;
2) const char* p2;
3) char const *p3;
4) const char* const p4;
其中,p1是指针常量, p2和p3都是常量指针,p4是常量指针,并且指针本身和它指向的内容都不可以被修改。
我的记忆方法:const 位于* 左边的,就是常量指针,位于*右边的,就是指针常量。其实若不纠缠于这两个易混的名字,单纯只是记住用法的话,可以这样类别。 const int *p1 与 const int a,可以将此处的*p1看做a,那么*p1是不可以修改的,p1是可以修改的。int* const p2就更简单了,只看const 后面的部分即可,p2不可以修改,那么*p2是可以修改的。就是这样简单。还有一点要注意的是,上面四种情况中,p1和p4必须在声明的时候初始化,因为不允许改指针的指向。
3. 实际应用举例
例1:
例2:找出下面代码段中的错误
解析:上面的代码中,node1和node2分别是常量指针和指针常量,并且在初始化时都指向了字符串常量“abc”(这是一个关键,字符串常量是不允许在以后修改的,只可以访问)。因此,它们对指向内存的修改都是非法的,如果是node1操作字符串,会出现编译错误,而node2修改字符串会出现运行错误。代码第8、9、10、14、16行出现编译错误,代码第11行正确;代码第13、15由于要改字符串常量,会出现运行时错误。
常量指针:即指针是常量形式,它首先应该是一个指针。表示一个指向常量的指针,它所指向的地址的内容是不可修改的。具体地,int a = 10; int b = 20; const int* p = &a; p = &b;// ok *p = b;//error!
指针常量:常量是指针形式,它首先是一个常量。他是不可改变地址的指针,但是可以对它指向的内容进行修改。具体地,int a = 10; int b = 20 ; int* const p = &a; p = &b; //error! *p = b;// ok!
2. 具体使用形式有四种
1) char* const p1;
2) const char* p2;
3) char const *p3;
4) const char* const p4;
其中,p1是指针常量, p2和p3都是常量指针,p4是常量指针,并且指针本身和它指向的内容都不可以被修改。
我的记忆方法:const 位于* 左边的,就是常量指针,位于*右边的,就是指针常量。其实若不纠缠于这两个易混的名字,单纯只是记住用法的话,可以这样类别。 const int *p1 与 const int a,可以将此处的*p1看做a,那么*p1是不可以修改的,p1是可以修改的。int* const p2就更简单了,只看const 后面的部分即可,p2不可以修改,那么*p2是可以修改的。就是这样简单。还有一点要注意的是,上面四种情况中,p1和p4必须在声明的时候初始化,因为不允许改指针的指向。
3. 实际应用举例
例1:
#include <stdio.h> void main() { int a = 1; int b = 2; const int* p1 = &a; // 常量指针 int* const p2 = &b; // 指针常量 b += 1; // 变量b本身是可以修改的 p1 = &b; // p1可以指向其他的变量,但是不管p1指向了谁,*p1都是不能修改的,此时*p1的值为3(即b+1) //*p1 = 100; // error! p1虽然现在指向了b,那么*p1就是3,不再是a的值,由于p1是个常量指针,不能对*p1进行修改 //p2 = &a; // error!p2是一个指针常量,指针不能修改,但是*p2可以修改 *p2 = 10; printf("*p1 = %d\n", *p1); // 输出 *p1 = 10,p1现在指向了b printf("*p2 = %d\n", *p2); // 输出 *p2 = 10 }
例2:找出下面代码段中的错误
#include <stdio.h> int main() { const char* node1 = "abc"; char* const node2 = "abc"; //node1[2] = 'k'; //*node1[2] = 'k'; //*node1 = "xyz"; //node1 = "xyz"; node2[2] = 'k'; //*node2[2] = 'k'; *node2 = "xyz"; //node2 = "xyz"; return 0; }
解析:上面的代码中,node1和node2分别是常量指针和指针常量,并且在初始化时都指向了字符串常量“abc”(这是一个关键,字符串常量是不允许在以后修改的,只可以访问)。因此,它们对指向内存的修改都是非法的,如果是node1操作字符串,会出现编译错误,而node2修改字符串会出现运行错误。代码第8、9、10、14、16行出现编译错误,代码第11行正确;代码第13、15由于要改字符串常量,会出现运行时错误。
相关文章推荐
- apache配置运行zendframework 2
- 编写bat脚本运行简单java项目-邮件发送基于spring示例
- 【C#利用后台动态加载数据】Winform“防界面卡死”
- mysql中 字段类型转换后进行排序
- 批量修改图形文件的对比度和锐度,python 2.7
- 让Mac轻松访问Windows网络共享
- virtualbox on archlinux host
- popen——C程序中获取Shell命令的输出
- HTML表格边框的设置小技巧
- IOS开发-给UIImageView赋无限循环动画
- IOS开发-自适应高度的UITextView的实现
- 判断应用是否安装、运行
- 360随身wifi原理,功能特点,使用说明
- 磊科无线路由器怎么设置密码【图文教程
- startActivityForResult()与onActivityResult()
- 伊斯兰自由大学:研究发现商店背景音乐不影响消费者行为
- 苹果iOS开发中如何直接跳转到App Store里面?
- 产品测试流程-选择测试内容
- shell编程中while与for的区别及效率比较
- 各种浏览器内核的区别