一:先看代码 cat 12.c
[oracle@localhost C]$ cat -n 12.c
1 #include<stdio.h>
2
3 int main()
4 {
5 const int x=1;
6 int b=10;
7 int c=20;
8
9 const int* a1=&b;
10 int* const a2=&b;
11 const int* const a3=&b;
12
13 x=2;
14
15 a1=&c;
16 *a1=1;
17
18 (*a1)--;
19
20 printf("a1=%d/n",a1);
21 printf("*a1=%d/n",*a1);
22 *a1--;
23 printf("a1=%d/n",a1);
24 printf("*a1=%d/n",*a1);
25
26 a2=&c;
27 *a2=1;
28
29 a3=&c;
30 *a3=1;
31
32 return 0;
33 }
二:编译代码:
[oracle@localhost C]$ gcc 12.c -o 12
12.c: In function ‘main’:
12.c:13: 错误:向只读变量 ‘x’ 赋值
12.c:16: 错误:向只读位置赋值
12.c:18: 错误:令只读位置自减
12.c:26: 错误:向只读变量 ‘a2’ 赋值
12.c:29: 错误:向只读变量 ‘a3’ 赋值
12.c:30: 错误:向只读位置赋值
[oracle@localhost C]$
三:问题剖析:
这是个关于const关键字的程序。
记住以下规则:
1.如果 const 位于 * 的左侧 ,则const修饰的是指针所指向的变量,即指针所指向的是一个常量;
也就是说指针指向的变量的内容不能改变。不能通过指针来改变。
2.如果 const 位于 * 的右侧, 则const修饰的是指针本身,即指针本身是常量。
也就是说,指针自己的内容不能够再次改变了,指针自己的内容原来指向哪里,就指向哪里。
举个例子:
int num =500;
const int* a = #
int const *a = #
int* const a = #
const int* const a = #
第二行和第三行,显然是一样的作用。因为const在* 左侧。 即指针所指向的是一个常量
那么 用 *a=49 ;这样赋值,必然不可以,因为*a必须是常量。但是 可以 num=49 ;
因为没有 说 num是常量,代码中的 num没有被const修饰。
第四行表示指针本身是常量,而指针指向的内容不是常量。所以 a--;必然不可以。因为
a保存的是num的地址,所以a不能改变,a是常量。但是 *a=49是可以的,因为*a的内容可以改变。
第五行表示指针本身和其所指向的内容都是常量。
如果上面的弄懂了,看看下面的:
(*a)--;
*a--;
第一个表示*a所指向的内容减1
第二个表示a的内容,先减1,然后再取它指向的变量的内容。相当于*(a--)
所以说,回过头来看编译12.c程序的结果就很清楚了。
如果把 错误的行注释掉,查看输出结果后,参考这篇文章来理解 a1--后的输出结果:
http://blog.csdn.net/longxibendi/archive/2010/07/31/5778314.aspx
四:参考
C++数据结构原理与经典问题求解
声明:本文档可以随意更改,但必须署名原作者
作者:凤凰舞者 qq:578989855