为什么常量的地址不能付给普通指针变量?

新手!被int * const p 和const int * p弄蒙了

1、常量指针
常量指针是指向常量的指针,指针可以指向不同的地址,但是指针指向的内存地址的内容是不可修改的。 const在*之前.,如:

int a=0,b=1;
const int *p; //声明常量指针p
p=&a; //p指向a
p=&b; //修改指针p让其指向b,允许
*p=2; //不允许
int const* p2;
p2 = &a; //同p意义一样

2、指针常量
指针常量是指针的常量,它是不可改变地址的指针,但可以对它所指向的内容进行修改。
指针常量定义"int *const p=&a;"告诉编译器,p是常量,不能作为左值进行操作,但允许修改其指向的内容,即*p是可修改的。指针常量必须在声明的同时对其初始化,不允许先声明一个指针常量随后再对其赋值,这和声明一般的常量是一样的,例如:
int a=0,b=1;
int *const p1=&a;
int *const p2; //不允许,必须对其初始化
p2=&b; //不允许,p2是常量不允许作为左值
*p1=2; //允许修改指针*p1的值

http://wenku.baidu.com/view/3b8881d9ce2f0066f533228e.html追问

恩 明白了许多 但为什么常量的地址也不能作为右值 ?还是有点不明白。比如 const int x=3;
int * pp;令pp=&x; 则错误!为什么?/weixiao 求解

追答

如果一个变量已经被声明成常变量,则只能用指向常变量的指针变量指向它,而不能用一般的(非const型的)指针变量指向它。
是C++的规定,你不要纠结这个问题

追问

嗯 谢谢 昨天晚上纠结这个问题,现在已经明白多了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-12-19
这是c语言的缺点。const 常把人搞混。
要记住的是 const 限定它下面紧接着的东西 是 “只允许读”,它不是左值
另外记住,只有能当“左值”的东西才能 被赋值。

int * const p; (1)*p 是 左值, 可读写.(2) 限定 p 不是左值。
const int *p;(1)p 是 左值, 可读写. (2) 限定 *p 不是左值.
程序例子:

#include<stdio.h>
main(){
{
int a=5,b=6;
int *const p = &a; // const p --not l-value
*p = a; // *p 是 左值, 可读写
printf("a=%d b=%d *p=%d p=%p\n",a,b,*p,p);
*p = b; // *p 是 左值, 可读写
printf("a=%d b=%d *p=%d p=%p\n",a,b,*p,p);
}
printf("=============\n");
{
int a=5,b=6;
const int *p; // *p -- not l-value
// *p = a; // err
p=&a; // p 是 左值, 可读写
printf("a=%d b=%d *p=%d p=%p\n",a,b,*p,p);
p=&b; // p 是 左值, 可读写
printf("a=%d b=%d *p=%d p=%p\n",a,b,*p,p);
}
}追问

恩 但为什么常量的地址也不能作为右值?比如 const int x=3;
int * pp;令pp=&x; 则错误!为什么?/weixiao 求解

相似回答