1.在 int * p = &a;情况下
int a = 10;
int * p = &a;
int const * p1 = p;
const int * p2 = p;
int * const p3 = p;
const int * const p4 = p;
int * p = &a;表示 * p的指向可以改变(即 * p的值可以改变),p本身的值也可以改变
①const int * p1 = &a; 和 int const * p1 = &a; 等价
const修饰 * ,表示p1的指向不可变(即 * p1不可变),但是p1本身可以变
②int const * p2 = &a;
const 修饰 * ,表示p2的指向不可变(即 * p2不可变),但是p2本身可以变
③int * const p3 = &a;
const 修饰 p3,表示p3本身不可改变,但是p3的指向可以改变(即 * p3可以改变)
④const int * const p4 = &a;
第一个const修饰 * 表示指向不可变(即 * p4不可变),第二个const修饰p4,表示p4本身不可以变
2.在 const int * p = &a;情况下
int a = 10;
const int * p = &a;
int * p1 = p;
int const * p2 = p;
int * const p3 = p;
const int * const p4 = p;
const int * p = &a; const 修饰 * ,表示s的指向不能改变(即 * p不能改变),但是p本身可以改变
①int * p1 = p;
表示*p1的值可以改变,p1本身的值也可以改变,能力扩展了,和我们希望的不符,所以不能编译通过
②int const * p2 = p;
const 修饰p2,表示p2的值不能改变,但是p2本身的值可以改变,和我们希望的相符,可以编译通过
③int * const p3 = p;
const 修饰 p3,表示p3本身的值不可以改变,但是*p3的值可以改变,和我们希望的不符, 不能编译通过
④const int * const p4 = p;
第一个const修饰 * 表示 *p4的值不能改变,第二个const修饰p4表示p4本身的值也不能改变,能力收缩了,可以编译通过
3.在 int * const p = &a;情况下
int a = 10;
int * const p = &a;
int * p1 = p;
int const * p2 = p;
int * const p3 = p;
const int * const p4 = p;
const 修饰 p,表示p本身的值不能改变,但是 * p的值可以改变,后面四行代码,都不会影响到p本身的值,他们的改变只会影响它们自身的值和 *p的值,所以都能编译通过
4.在C++(.cpp文件)中,C++把常变量当成常量来处理,在编译的时候就对其进行了替换
int main()
{
const int a = 10;
int b = 0;
int *p = (int *)&a;
*p = 100;
b = a;
cout << "a = " << a << "b = " << b << "*p = " << *p << endl;
return 0;
}
**注意:int *p = (int *)&a;必须要强转,写成int *p = &a;是不能编译通过的,原因是不能把常量的地址泄露给非常量的指针,但是写成int p = const_cast <int >(&a);是可以的,这个称为去常性强转,就是把a的常性去掉,去常性强转要比直接强转要好的多
输出结果为a = 10 b = 10 *p = 100
因为a是一个常变量,所以在编译的时候就把b = a替换为了b = 10,把cout << "a = " << a << "b = " << b << "*p = " << *p << endl; 替换为了cout << "a = " << 10 << "b = " << b << "*p = " << *p << endl;
5.在C语言中(.c文件中)
int main()
{
const int a = 10;
int b = 0;
int *p = (int *)&a;
*p = 100;
b = a;
cout << "a = " << a << "b = " << b << "*p = " << *p << endl;
return 0;
}
最终的结果为,100 100 100,因为b = a是从寄存器中取值赋给b,所以C语言的编译方式和C++是不一样的
(6)那么如何区分是按照C编译还是C++编译呢?
通过宏,如果是.C文件就按照C的输入输出方式,如果是.cpp文件,就按照C++的输入输出方式
#ifdef __cplusplus
#incldue <iostream>
using namespace std;
#else
#include <stdio.h>
#endif
int main()
{
const int a = 10;
int b = 0;
int *p = (int *)&a;
*p = 100;
b = a;
#ifdef __cplusplus
cout << "a = " << a << "b = " << b << "*p = " << *p << endl;
#else
printf("a = %d b = %d *p = %d",a,b,*p);
#endif
return 0;
}