终于总结完了这个知识点,现在拿出来和大家分享,如果有不正确的地方希望给出宝贵的意见.
带有const的一级指针四种合法定义如下:
const char *, char const *, char *const, const char *const
const char *p;
char const *p;
这两个定义是完全一样的,而规范的写法是 const char *p,都是指向静态字符的指针。
P是可以改变的,但是*p不能改变的。即:pointer to const char.
char *const p;
说实在的我本以为这种定义是违法的,但是实质上这种定义是用来限定指针p是不能被改变的,而*p是可以改变的。即:const pointer to char.
const char *const p;
这是一级指针最严格的定义。指针p不能改变,而且*p也不能改变。即:const pointer to const char.
理解这几种定义和其含义并不难,但是需要区分一些不合法定义,就需要下一些工夫了。另外这里所说的静态,是指不能通过此指针改变。
比如: const char *p;
char A;
char B;
A=2;
B =3;
P = &A: //这个是合法的,此时 P指向地址的值为2
P = &B; //这个是合法的,此时 P指向地址的值为3
B = 5; //这个是合法的,此时 P指向地址的值为5
*P = 6; //这个是不合法的
也就是说虽然这个定义说P指向地址的值不能改变,其实是不能通过P来改变,并没有说不能通过其它方式改变。
总结:在一级const指针定义中,指针的值和指针指向地址存放的值,此两个值的状态是可以改变的。
带有const二级指针四种合法定义:
const char **p; chat const **p; char *const *p; const char *const *p
const char **p;
char const **p;
两者意义相同,指的是p,*p都是可以改变的,但是**p是不能被改变的。
char *const *p;
指的是p和**p可以给改变,但是*p是不能被改变的。
const char *const *p;
指的是p可以被改变,但是*p和**p都是不能被改变的。
总结:做了这么多的实验终于总结出了一条规律就是:在只有1个const的指针定义中,指针变量定义在程序中是不能被改变的。例如const char *p; *p是不能被二次赋值的;
char *const p; 则p是不能被二次赋值的。char const **p; 则**p是不能被重复赋值的。
如果还感觉到不好记忆话不防在看看以下三条规定:
1, 在定义指针是第一个字符不能为*;
2, 在基本数据类型不能被*直接修饰;
3, 定义时不是直接修饰变量的*,不能连续出现。
谈到这里还有一个问题没有解决,就是如何使一个二级指针的指向具有静态性呢?
我不知道,你知道能告诉我吗?
下面讨论一下指针的近亲数组和const的关系:
const char arry[2]; const char arry[2][4]; ……
char const arry[2]; char const arry[2][4]; ……
想必大家对这个比较熟悉,其含义是数组中的内容是不能被改变的。不论是一维,二维还是更高的维数的数组。即arry[],arry[][]等等是不能二次赋值的。
const char *arry[2];
与指针类似,这里的*arry[0],*arry[1]不能二次赋值。(不要告诉我你不知道*arry[0]表示的是
什么意思)
char *const arry[2];
这个定义没有意义。因为arryp[]不能被赋值。
const char *const arry[2];
这个定义也没有意义。