linux c 中关于指针常量和常量指针以及数组的关系与区别

常量指针:

         他是一个指针 只不过这个指针比较特别  他是一个受限的常量 (为什么这么讲呢 因为他不能通过指针去改变所指向的地址的值)。

         char const *p;

         char arr [10]="nihao";

         p=arr;

         p[1]='n' ; 这里就错了 不能通过p来改 arr 的值 因为p是一个 常量指针。

         arr[1]='n'; 这是允许的 可以通过原来的地址变量来改变 p所指向的值

                p的值可以在改 例如 p=&q;              


        常量指针多在 字符串处理函数的参数中 应用 防止改变带入的参数的值。


 指针常量:

         首先它是一个常量 其次他才是一个指针 , 那么常量就不能再初始化后再改变, 那么指针的值是什么呢, 他就是一个地址值而已,如此就理解了 指针常量的含义和用法了。

        char  * const p  ;

         char arr[10]="nihao";

        p=arr; 初始化 必须要初始化。

          

         由上面的解释可以看出: 再p初始化后就不能再改了。

          p=&q ; 错误 它是一个常量。

          p[0]='n';  合法 他不是一个常量 所以可以改变他的值。

          arr[0]='n';   合法 这肯定可以。


          区别常量指针和指针常量的关键是  看他不能改变他自己的值还是不能改变他所纸箱的值。  


数组: 

      这是一个和神奇的数据结构, 他在函数参数中就是指针。 其实他和指针是两个不同的数据结构,但他的算数运算和调用方式和指针是相同的,但他在声明后即成为的一个局限性常量。 他的地址值就不可再改变, 因此我们把数组称作 指针常量。 

      

        因此在有些双指针参数中要注意数组,不可以再函数中改变这个参数的地址值。如 strsep(char**p, char*delam) 中就不能吧 数组的地址值带入。

       

       数组不占内存空间 他和指针不同(数组名就是首地址)。

     

猜你喜欢

转载自blog.csdn.net/sdc20102010/article/details/56678305