常量指针:
他是一个指针 只不过这个指针比较特别 他是一个受限的常量 (为什么这么讲呢 因为他不能通过指针去改变所指向的地址的值)。
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) 中就不能吧 数组的地址值带入。
数组不占内存空间 他和指针不同(数组名就是首地址)。