微观C技术

作者在 2008-12-22 16:56:04 发布以下内容

带有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都是不能被改变的。

 

总结:做了这么多的实验终于总结出了一条规律就是:在只有1const的指针定义中,指针变量定义在程序中是不能被改变的。例如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];

这个定义也没有意义。

默认分类 | 阅读 1651 次
文章评论,共0条
游客请输入验证码
文章分类
文章归档
最新评论