很多人纠结过这两个名词,也有人写文章区分两者的区别。其实很简单,常量指针和指针常量一个是指针、一个是常量。

       const int *p_var;与

       int const *p_var;

       的功能是相同的,都是一个指向整型常量的指针。指针的数值可以修改,但是当前指针指向的量不可修改。该如何去确认p_var的含义呢?我从一片老外写的文章中学了一招,无论什么时候,都把*读作“value of address”就容易了。按照这个方法,这个生命表达的含义应该是:

       地址p_var的值(*p_var)指向整型常量,那么p_var便是一个指向常量的指针了。写一段代码测试:

#include"stdio.h"

 

const int a = 123;

const int *p_var1= &a;

int const *p_var2= &a;

 

int main(void)

{

       printf("value of p_var1 is:%p\n",p_var1);

       printf("value of p_var2 is:%p\n",p_var2);

 

       printf("value-1:%d\n",*p_var1);

       printf("value-2:%d\n",*p_var2);

 

       p_var1 += 1;

       p_var2 += 1;

 

       return 0;

}

       编译运行结果:

E:\WorkSpace\01_编程语言\01_C语言\03_declare>gcc exp_33.c

 

E:\WorkSpace\01_编程语言\01_C语言\03_declare>a

value of p_var1is: 00404024

value of p_var2is: 00404024

value-1: 123

value-2: 123

       从运行得出结论:

       1,常量指针两种定义方式都可以;

       2,常量指针可以修改;

       上面的代码做一下修改,增加对初始指向常量的修改:

#include"stdio.h"

 

const int a = 123;

const int *p_var1= &a;

int const *p_var2= &a;

 

int main(void)

{

       printf("value of p_var1 is:%p\n",p_var1);

       printf("value of p_var2 is:%p\n",p_var2);

 

       *p_var1 = 234;

 

       printf("value-1:%d\n",*p_var1);

       printf("value-2:%d\n",*p_var2);

 

       p_var1 += 1;

       p_var2 += 1;

 

       return 0;

}

       编译结果如下:

E:\WorkSpace\01_编程语言\01_C语言\03_declare>gcc exp_33.c

exp_33.c: Infunction 'main':

exp_33.c:12:10:error: assignment of read-only location '*p_var1'

  *p_var1 = 234;

          ^

       从上面的结果可以看出,初始指针指向的位置是常量,不能够修改。对代码进行进一步修改如下:

#include"stdio.h"

 

const int a = 123;

const int *p_var1= &a;

int const *p_var2= &a;

 

int main(void)

{

       printf("value of p_var1 is:%p\n",p_var1);

       printf("value of p_var2 is:%p\n",p_var2);

      

       p_var1 += 8;

       *p_var1 = 234;

 

       printf("value-1:%d\n",*p_var1);

       printf("value-2:%d\n",*p_var2);

 

       p_var1 += 1;

       p_var2 += 1;

 

       return 0;

}

       编译:

E:\WorkSpace\01_编程语言\01_C语言\03_declare>gcc exp_33.c

exp_33.c: Infunction 'main':

exp_33.c:13:10:error: assignment of read-only location '*p_var1'

  *p_var1 = 234;

          ^

       从这里可以看出,尽管指针修改了,但是其指向的空间依然是不可修改的,否则会引起编译器报错。

       接下来看看指针常量,再一次分析一下语义:这是一个指针,但是是一个不可修改的指针。这样,联想常量的定义就可以知道,如果想让它具有什么值得化需要在初始化的时候就完成。而个指针的特点是,本身不能够修改,但是指向的内容是可以修改的。指针常量的定义声明方式如下:

       首先利用前面的“value ofaddress”方法描述,应该是:value of address 一个常量指针指向XXX。如此,

Int * const p_var = XXX;

       写代码如下;

#include"stdio.h"

 

int a = 123;

const int b = 234;

 

int *const p_var1= &a;

int *const p_var2= &b;

 

int main(void)

{

       printf("value at p_var1 is:%d\n",*p_var1);

       printf("value at p_var2 is:%d\n",*p_var2);

 

       a += 1;

 

       printf("value at p_var1 is:%d\n",*p_var1);

 

       return 0;

}

       编译运行:

E:\WorkSpace\01_编程语言\01_C语言\03_declare>gcc exp_34.c

exp_34.c:7:21:warning: initialization discards 'const' qualifier from pointer target type

 int *const p_var2 = &b;

                     ^

 

E:\WorkSpace\01_编程语言\01_C语言\03_declare>a

value at p_var1is: 123

value at p_var2is: 234

value at p_var1is: 124

       虽说是遇到了警告,但是编译还是通过了而且可以运行。由此,可以得出结论:

       指针常量指向的值可以是变量也可以是常量。

       再次修改代码;

#include"stdio.h"

 

int a = 123;

const int b = 234;

 

int *const p_var1= &a;

int *const p_var2 =&b;

 

int main(void)

{

       p_var1 += 1;

 

       printf("value at p_var1 is:%d\n",*p_var1);

       printf("value at p_var2 is:%d\n",*p_var2);

 

       a += 1;

 

       printf("value at p_var1 is:%d\n",*p_var1);

 

       return 0;

}

       编译:

E:\WorkSpace\01_编程语言\01_C语言\03_declare>gcc exp_34.c

exp_34.c:7:21:warning: initialization discards 'const' qualifier from pointer target type

 int *const p_var2 = &b;

                     ^

exp_34.c: Infunction 'main':

exp_34.c:11:9:error: assignment of read-only variable 'p_var1'

  p_var1 += 1;

         ^

       这次是直接遇到了错误而停止了编译,可以看出这个指针实际上不可修改的。