test1.c
//error
#include <stdio.h>
int main(void)
{
int i = 5;
const int *p = &i;
printf("%d\n",*p);
*p = 10;
printf("%d\n",*p);
return 0;
}
test2.c
//error
#include <stdio.h>
int main(void)
{
	int i = 5,j = 10;
int* const p = &i;
	printf("%d\n",*p);
p = &j;
printf("%d\n",*p);
return 0;
}
test3.c
// correct
#include <stdio.h>
int main(void)
{
	const int i = 5;
	int *p = &i;
*p = 10;
	printf("%d\n",*p);
	return 0;
}
说明
当const在左边时,及表示const修饰了指针变量指向的那块内存,当const在右边时,则表示const修饰了指针变量。
用const修饰的指针变量被称为指针常量,及表示该指针变量只能付一次值。
test2中的指针变量p指向了变量i,后又试图指向j,所以这是错误的。
用const修饰指针变量指向的内存,则该指针变量被称为常量指针,及表示该指针变量没有对它指向的内存进行改写的权利,但该指针变量仍可以改变自身的指向,无论该变量指向哪一块内存,都无法对他指向的内存进行改写。
在test1中,指针变量p的定义声明了该变量指向的内存是const,p指向了i,p无法对i进行改写,但由于i本身的定义中没有用const修饰,所以i可以自身改写自身的值,如果i改写了自身的值,则p读入的及是i改写后的值。
如果一个指针变量指向了一块本身是const的内存,则该内存自身无法修改自身的值,但通过指针变量就可以修改它的值,在test3中 证明了这点。
知乎: @张赐荣
赐荣博客: www.prc.cx
 
                    
                 
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号