C语言指针的一些谬误

const的使用

const int*x与int* const x分别指指针指向常量 和 指针常量

可以形象写为(const int )* x 与 int *(const x)

#include<stdio.h>
int main(){
	int x=1,y=2;
	int* const m=&x;
    const int* n = &y;
    y++;
    (*n)++;
	x=2;
	m=&y;
	
}

m是指针常量,对m的重新赋值非法

对n的重新赋值可以。

n是指向常量的指针,所以不能通过解引用n的方式进行自增自减等操作,但是对y本身操作没有问题,因为y没有限定为常量。同时,可以修改n的地址。

常量指针可以指向普通变量

int x=1;
const int*a=&x;

此时x可以修改,但不能通过*a的形式修改 

尽量不要用普通指针指向常量,可能发生未知错误。

const类型指针转换

非const可以以赋值形式隐式转型成const(若以高阶低阶来理解,那么就是非const低于const

const变量如果想赋值给非const变量必须要显式转型。

int main(){
	int x=1;
	const int y=3;
	const int* a=&y; 
	int* b=&x;
	const int*a1=b;//合法,非const隐式转型
	int*b1;
	b1=a; //非法
	b1=(int*)a;//合法 
	return 0;

显示转型不改变原变量类型

​
int main(){
	const int* a;
	const int x=1;
	a=&x;
	(*(int*)a)++;//x=2
	(const int*)a;
	(*a)++;//报错
	return 0;
}

​

对a第一次解引用时发生显式转型,把a从原本的const int*类型看成普通的int*类型,解引用并改变值的操作合法。

但是,这里的显式转型是暂时的,并不改变a的类型。也可以说,显式转型只是在操作的时候用另外的方法读取变量而已,并不涉及对变量本身属性的更改。

第二次解引用时,a仍然是const int*变量,再解引用并自增就会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值