常量指针与指针常量的区别

来源:互联网 发布:网络通信 编辑:程序博客网 时间:2024/06/02 04:49
const     常量
*     指针

const int * p = int const * p  //常量指针
int * const p //指针常量

常量指针通常指向常量,不能通过指针去修改常量的值。
有时也会指向变量,eg:
int s = 10;
const int * p = &s;
但还是不能通过指针去修改指向的常量的值,可以通过 s=20,去修改这个值。
总结,常量指针就是"为了指向常量而发明的指针"


指针常量首先是一个指针,其次这个指针类型的值是常量,声明时要初始化,且不能改变。
但这个指针指向的值是可以改变的。

char     * a = "abcde1234";    // a是指向常量字符串的字符串指针变量
const     char *b = "bcde";     // b是指向常量字符串的字符串常量指针
char     * const c = &a;      // c是指向字符串指针变量的字符串指针常量
const     char *const d = &b;     // d是指向字符串常量指针的指针变量

问题来了。

1)问:因为a是变量,a可以赋值为其它值,如"12345abc"。那么c指向a,当a变化了,c指向什么呢?
    【错误】c是字符串指针常量,c自身不能改变,但c指向的值可以变化。所以,c指向变化后的a。
    【正确】a改变之前,a和c都指向"abcde1234".后来a变了,c还是存的是"abcde1234"的地址。所以c指向的未变化。

2)问:a是变量,可以改变a的内容。那么当执行了“a[0] = 'x';”后,c会怎样呢?
    【正确】a[0]不能赋值,指向的是字符串常量.

3)问:b是指向常量的指针变量,当b指向别的字符串,d怎么样?
    【正确】跟1)一样.

4)问:b可以变化,b指向的字符不能变化,也就是说b[0]不能被重新赋值,可是b[1]可以被重新赋值吗?
    【正确】不可以.

 
原创粉丝点击