标签:
ANSIC允许声明常量,常量和变量不同,常量就是不可以改变的量,用关键字const来修饰
比如:const int a
int const a
以上两种声明方式是一样的,我们不需要考虑const和int的先后顺序,按照你理解的方便的一中方式进行应用。
因为const和int的顺序先后并不影响结果,因此 int const * && const int *这两中情况就是一样的
所以我们只需要讨论两种情况
------------------------------------------1:int const *ptr
我们说过const int a;就是声明一个int型的常量,而int * ptr;是声明一个int型的指针变量,因此终上所述int const *ptr就是生命一个指向整形常量的指针,我们可以修改指针的值,但是不可以修改*ptr的值,也就是指针所指向的值;
1 #include<stdio.h> 2 int main(){ 3 int a=10; 4 int b=20; 5 int const * p1=&a; 6 //(*p1)=12; 我们可以修改指针的值,但是不能修改他所指向的值 7 p1=&b; 8 printf("%d\n",*p1); 9 b=30; 10 printf("%d\n",*p1); 11 return 0; 12 }
上面的程序中,p1的值可被修改,可以指向另一个变量的地址,但是(*p1)的值不可以被修改了
首先const 修饰的是整个*pi(注意,我写的是*pi而不是pi)。所以*pi是常量,是不能被赋值的(虽然pi所指的b是变量,不是常量)。 其次,pi前并没有用const 修饰,所以pi是指针变量,能被赋值重新指向另一内存地址的。
------------------------------------------2:int * const ptr
#include<stdio.h> int main(){ int a=10; int b=20; int * const p1=&a; printf("%d\n",*p1); (*p1)=12; //p1=&b; // 我们可以修改他所指向的值,但是不能修改指针的值 printf("%d\n",*p1); return 0; }
我们这里const修饰的p1,p1的值不能改变,但是我们可以改变他所指向的值
p1有了const的修饰,变成了一个指针常量,不能被修改
整个*p1没有被const修饰,所以*p1是变量,而不是常量
-----------------------------》3转换问题
1 #include<stdio.h> 2 int main(){ 3 4 const int n=10; 5 int *p; 6 p=(int *)&n; 7 printf("%d\n",*p); 8 *p=12; 9 printf("%d\n",*p); 10 return 0; 11 }
情况一:int * pi指针指向const int n常量的情况
const int n=10;
int *p;
p=&n;//这样可以吗?不行,VC下是编译错。const int 类型的n的地址是不能
//赋值给指向int 类型地址的指针p的。否则p岂不是能修改n的值了吗!
p=(int* ) &n; // 这样可以吗?强制类型转换可是C所支持的。
//VC下编译通过,但是仍不能通过*p=80来修改n的值。去试试吧!看看具体的怎样
情况二:const int * p指针指向const int n的情况
const int n=40;
const int * p;
p=&n;//两个类型相同,可以这样赋值。n的值无论是通过p还是n都不能修改的。
情况三:用const int * const p申明的指针
int n;
const int * const p=&n;
//你能想象p能够作什么操作吗?p值不能改,也不能通过修改n的值。因为不管是
//*p还是p都是const的
int *const && int const * && const int *的区别
标签:
原文地址:http://www.cnblogs.com/13224ACMer/p/5582534.html