如何来理解c语言的这个陷阱

本文通过实例解析了C语言中关于const关键字的使用陷阱,特别是当const与指针结合时容易产生的误解,并给出了详细的解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


首先还请先看完前一篇“如何理解const char*, char const*, char*const等

 

C语言的一个经典的陷阱:

下面的代码中编译器会报一个错误,你知道是哪个语句错了吗?

 

1.     typedef char * pStr;  

2.     char string[4] = "abc";  

3.     const char *p1 = string;  

4.     const pStr p2 = string;  

5.     p1++;  

6.    p2++;

 

答案是第6句,p2不能改变。可p1,p2不是一样吗,怎么就不能改变值了呢?

P1,p2不一样,typedef之后,pStr要当成一个整体,这时const修饰的是p2,相当于const (char *) p2,也就是上一篇里面的那个例子,什么?忘了!?回头再看下。

pStr被当成整体后,返回的是p2,const描述的是p2不能变。所以第6句错了。

 

 

 

到这里,我想到一个问题,按解释*P1是const,可没说*(p1+1)是const。它已不是前面说的内存2,而是内存2后面的那块内存。没说他是const啊,能被赋值吗?如*(p1+1)=”d”;


首先重申一下,这里的Const并不是说那块内存不能修改,而是通过这种方式不能修改那块内存,忘了的话,再去看看前一篇。描述有问题的,自行改正(^-^)。

 

事实证明*(p1+1)=”d”是不行的,为什么呢?官方的说法我不知道。奇淫技巧可以这么来解释:

首先你要对一个东西赋值,你总得先知道这是什么东西吧。好看看左边“*(p1+1)”,这是什么东西?

“(p1+1)”:整个相当于p,也就是内存1,他是由p1衍生出来的兄弟变量,新的变量copy了兄弟的特点,相当于(p1+1)也被const char *修饰过了一般,其用法跟p1一模一样,所以不能通过这种方式来修改那块内存。

写得不好,欢迎拍砖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值