您的位置:首页 > 其它

指针常量与常量指针的区别

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:

#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由于要改字符串常量,会出现运行时错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: