首页 新闻 搜索 专区 学院

为什么const int * 不能给int* 赋值呢?

0
[待解决问题]

为什么const int * 不能给int* 赋值呢?
复制代码

1 int a = 1; 
2 int b = 2;
3 
4 const int * p1 = &a;
5 int* p2 = &b;
6 
7 p2 = p1;   // 提示有错

8 p1 = p2;  // 提示正确
9 cout << *p2 << endl;
复制代码

 我的理解如下:既然p1指向的内容是const的,那么不能改变p1指向的值?那么p1 = p2应该是不行的? p2 = p1应该是可以的?

C++
赢定的主页 赢定 | 菜鸟二级 | 园豆:206
提问于:2016-10-19 15:12
< >
分享
所有回答(8)
1

这是规定。你上面的代码里,如果p1的值能赋值给p2,那p1的const限定就没什么意义了。

灵枢 | 园豆:297 (菜鸟二级) | 2016-10-19 15:24
int main(char argc, char* argv)
{
    int a = 1; 
    int b = 2;

    const int * p1 = &a;
    int* p2 = &b;

//    p2 = p1;                // 提示有错
//    cout << *p2 << endl;

    p1 = p2;
    cout << *p1 << endl;

    system("pause");
    return 0;
}

p1 = p2 居然可以,p2 = p1不行。

我觉得既然p1指向的内容是const的,p1 = p2应该是不行的? p2 = p1应该是可以的?

支持(0) 反对(0) 赢定 | 园豆:206 (菜鸟二级) | 2016-10-19 16:23

@赢定: p1指向的内容是const的,但p1不是,所以p1可以被修改,如果希望p1不能被修改应该定义 int* const p1; 指针指针常量与常量指针的区别在于const限定的是哪个部分,如果定义const int* const p1,那么p1与p1所指向的内容都不可以修改。

支持(2) 反对(0) 灵枢 | 园豆:297 (菜鸟二级) | 2016-10-20 10:35
0

 

 
const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。

const关键字的作用主要有以下几点:

(1)可以定义const常量,具有不可变性。 例如:
const int Max=100; int Array[Max];
(2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。例如: void f(const int i) { .........} 编译器就会知道i是一个常量,不允许修改;
(3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。
(4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错; 例如:
void f(const int i) { i=10;//error! }
(5) 为函数重载提供了一个参考。
class A { ......
void f(int i) {......} //一个函数
void f(int i) const {......} //上一个函数的重载 ......
};
(6) 可以节省空间,避免不必要的内存分配。 例如:
#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
(7) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
眄眄 | 园豆:211 (菜鸟二级) | 2016-10-19 16:00
0

是不是:

int* const p1 p1不能变, p1 指向的值可以变

 

const int *p1  p1 可以变,p1 指向的值可以变

左边是一棵树 | 园豆:199 (初学一级) | 2016-10-22 19:44

学到了,感谢

支持(0) 反对(0) 金双平 | 园豆:200 (初学一级) | 2019-01-16 16:57
0

这段代码中,因为p1指向的值是不可以改变的,p2指向的int值可以改变。 

如果把p1赋值给p2,那么p1就有被改变的可能性,这和上述的性质相违背,所以不可以如此赋值。

躺着喝水 | 园豆:157 (初学一级) | 2016-12-19 18:02
0

如果p2 = p1;可以

那么p1指向的int值就可以通过p2来修改了。

附一篇帖子,effective c++ 中关于const的

http://www.cnblogs.com/danshenmaogou/p/6384546.html

HarlanC | 园豆:202 (菜鸟二级) | 2017-02-11 23:13
0

常量指针和指针常量的区别:

int a;
int * const p = &a //指针常量,*p可以修改*p = 8;(OK)
p不可以修改 p++(ERROR)

int a,b;
const int *p = &a;//常量指针 *p不可修改 *p = 8;(ERROR)
p 可以修改 p = &b (OK)

还有一种
const int * const p = &a; // *p 和 p均不可改变了

加油!!! | 园豆:199 (初学一级) | 2017-03-28 22:37

Thank you so much!!

支持(0) 反对(0) 金双平 | 园豆:200 (初学一级) | 2019-01-16 16:58
0

const 后面的是常量,不能更改

xhw_233 | 园豆:263 (菜鸟二级) | 2018-07-10 11:59
0

在拷入拷出中,可以忽视顶层const,但必须考虑底层const,如果p2 = p1合法,那么p1指向的内容存在被修改的风险,违背了底层const,参考自C++ Primer 中文第五版 第58页。

VanderWaals | 园豆:202 (菜鸟二级) | 2021-01-24 19:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册