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

来源:互联网 发布:sql定义表变量 编辑:程序博客网 时间:2024/05/22 07:14


首先还请先看完前一篇“如何理解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一模一样,所以不能通过这种方式来修改那块内存。

写得不好,欢迎拍砖。

0 0