指针剖析,地址关系(四) const 那些事

来源:互联网 发布:淘宝网分销商 编辑:程序博客网 时间:2024/04/29 18:46

一:先看代码   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 = &num;
int const *a = &num;
int* const a = &num;
const int* const a = &num;

第二行和第三行,显然是一样的作用。因为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

原创粉丝点击