目录
const在C和C++中的区别
C方式
C++方式
?const与指针
const
指针之间的相互赋值
const在C和C++中的区别
C方式
C方式编译时
以变量为主。所以编译器会报错,原因为:为一个变量,在定义数组时n要求为一个常量,要么是#define定义的宏常量要么是enum枚举常量或者是一个具体的数值。
*p的改变改变的时n本身。
在汇编层面:到n的地址空间,把n的值给eax,再把eax的值给b,
C++方式
C++编译时:以常量为主。
在汇编层面,?
在C++中你看到的代码不是真正的代码,n是一个常变量,在编译时遇见n用5进行替换,但调试是在源码中调试,执行是在汇编机器上执行,看见的和具体执行的不是一回事。虽然在内存中通过*p把n的值变成100,但在编译的时候n不复存在,把它替换成5,把5给b,所以最后打印的结果为n=5 b=5 *p=100。
?const与指针
?
指针有两个值,一个是他自身的值,一个是他解引用后的值。p1通过解引用可以改变a的值,但是p1自身还可以指向b,p1里存放的时a的地址,解引用就是a本身
const
const int* p2 =&a;与int const* p2 = &a;这两种写法是等价的。
const在星号(*)左边,修饰的是它的指向能力,p2指向了a的地址,但由于const的修饰,通过*p2去改变a的值是不允许的。但p2本身没有被const修饰,p2本身是可以被改变的。
const在星号(*)的右边,const和变量名离得较近,修饰的是变量名。指针变量用const修饰变成了一个常性指针,所以p3自身是常性,可以对p3进行解引用,但是不能对p3进行写
?
?两个const分别修饰p4得指向能力和指针变量。说明p4自身不能变,指向能力也不能变,无法对p4进行解引用,p4自身的值也不能变,不可写但可读。封锁的是写的能力。
变量和指针之间的关系
?const int b=20;//b是一个常变量
const int* p2=&b;//p2可以指向b,但是不能修改b
指针之间的相互赋值
s指向a不能对a进行解引用,把s的值给p1时,*p1可以改变a的值,能力被扩展不安全error;p3的const修饰的是指针自身不能改变,可以通过*p3去解引用,能力被扩展不安全error。
?
?s自身不能改变,但可以改变指向。s给p1时,*p1可以改变指向的值,p1指向&b时,不会使s也指向&b,所以编译通过;p2和p1一样,多了一个指向约束,可以指向但不能改变,可以编译通过。
用常性修饰相同类型的指针时,发生的数值兼容性规则,主要的问题就是安全性。
|