指针的知识重点很多,常量指针和指针常量在程序中会经常出现,并经常会让人误解。
(1)常量指针:表述为“是常量的指针”,它首先应该是一个指针。
(2)指针常量:表述为“是指针的常量”,它首先应该是一个常量。
常量指针,它是一个指向常量的指针。设置常量指针指向一个常量,为的就是防止写程序过程中对指针误操作出现了修改常量这样的错误,编译系统就会提示我们出错信息。因此,常量指针就是指向常量的指针,指针所指向的地址的内容是不可修改的。
指针常量,它首先是一个常量,然后才是一个指针。指针常量就是不能修改这个指针所指向的地址,一开始初始化指向哪儿,它就只能指向哪儿了,不能指向其他地方了,就像一个数组的数组名一样,是一个固定的指针,不能对它移动操作。如果使用p++。系统就会提示错误。但是注意,这个指向的地方里的内容是可以替换的,这和上面说的常量指针是完全不同的概念。总之,指针常量就是指针的常量,它是不可改变地址的指针,但是可以对它所指向的内容进行修改。
下面是四个指针例子:(可以自己先做出判断)
(1) char * const p1 ;
(2) char const * p2 ;
(3) const char * p3 ;
(4) const char * constp4 ;
如果const位于*号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*号的右侧,const就是修饰指针本身,即指针本身是常量。因此,p1指针本身是常量,但它指向的内容可以被修改。p2和p3的情况相同,都是指针所指向的内容为常量。p4则表示指针本身是常量,并且它指向的内容也不可被修改。
(1)p1是指针常量,它本身不能被修改,指向的内容可以被修改
(2)p2和p3是常量指针,它本身可以被修改,指向的内容不可以被修改
(3)p4本身是常量,并且它指向的内容也不可被修改
如下代码,编译存在错误,主要靠对于常量指针和指针常量作用的理解
#include <stdio.h>
int main()
{
const char *node1 = "abc" ;
char *const node2 = "abc" ;
node1[2] = 'k' ;
*node1[2] = 'k' ;
*node1 = "xyz" ;
node1 = "xyz" ;
node2[2] = 'k' ;
*node2[2] = 'k' ;
*node2 = "xyz" ;
node2 = "xyz" ;
return 0 ;
}
上面的代码中,node1和node2分别是常量指针和指针常量,并且都在初始化时指向了常量字符串“abc”。因此,他们对于指向的内存进行修改都是非法的,如果是node1操作,会出现编译错误,而node2会出现运行错误。
所以综上,代码第8,9,10行出现编译错误;第11行正确;代码第14,16行出现编译错误,第13、15行出现运行时错误。