159-C++中const和指针的关系

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值