/******************************************************************** 2013年5月6日13:19:57 该例子说明几个问题 1. const int *p语义: (1) const 修饰的是整个*p,所以*p是个常量,是不能被赋值的。 (2) p前并没有用const修饰,所以p是指针变量,能被赋值重新指向另一个内存地址。 (3) int const *p 与 const int *p完全相同。 2. int *const p语义: (1) p因为有了const修饰,所以p值是不可修改的。 (2) 整个*p的前面没有const的修饰,也就是说,*p是变量,所以可以通过*p来修改它所指内存的值。 3. 总结: (1) 如果const修饰在*p前,则不能改的是*p,p的值可以修改。 (2) 如果const是直接写在p前面,则p不能改,*p的值可以修改。 4. 两个基础概念: 指针常量和常量指针(重点要分清总结的两句话,至于叫什么,知道就行,不必深究) (1) 指针常量: 即指针本身的值是不可改变的,而指针指向的变量的值是可以改变的; (2) 常量指针: 即指针指向的变量的值是不可改变的,而指针本身的值是可以改变的;
原文:彻底搞定C指针-姚云飞 测试环境vc6.0 ********************************************************************/
#include <stdio.h>
int main(void) { int i = 30; int j = 40; //==================================test const int *p================================== /*const int *p = &i; p = &j; //ok //*p = 80; //error j = 80; printf("%d\n", *p);*/ //==================================test int *const================================== /*int *const p = &i; //p = &i2; //error *p = 80; printf("%d\n", i);*/ //========================情况1:int *p指针指向const int i常量======================== /*const int a = 40; //int *p = &a; //error: cannot convert from 'const int *' to 'int *',否则p岂不是能修改a的值了吗 int *p = (int *)&a; //ok *p = 80; printf("a = %d\n", a); //a还是40 printf("*p = %d\n", *p); //*p = 80*/ //========================const int *p指针指向const int i============================= /*const int b = 40; const int *p = &b; //ok //*p = 80; //error //b = 80; //error*/ //========================用const int *const p声明的指针============================== int c = 10; int d = 20; const int * const p = &c; //p的值不能改,也不能通过p修改c的值 //*p = 80; //error //p = &d; //error return 0; }
|