字符串常量指针、常量指针和指针常量的区别

char *p = "hello";
*p = 'a';
printf("%s\n", p);

字符串“hello”保存在常量区,其内容不许修改。
char *p = "hello"; // p是一个指针,直接指向常量区,修改p[0]就是修改常量区的内容,这是不允许的。
char p[] = "hello"; // 编译器在栈上创建一个字符串p,把abcd从常量区复制到p,修改p[0]就相当于修改数组元素一样,是可以的。
char p[10]="hello";
char *p1=p;
p1[0]='a';
printf("%s\n",p1);
这样是可以的,字符串"hello"编译器会给它分配空间(在栈中),而p1则是指向这个字符串的指针,所以能修改它的值. 

 

常量指针

常量指针是指向常量的指针,指针指向的内存地址的内容是不可修改的。如:const int *p=&a;*p是常量,不能讲*p放在等号左边进行操作。但这里指针p还是一个变量,他还可以被修改指向别的地址,如p=&b。

 

指针常量

指针常量是指针是常量,他是不可改变地址的指针,但是可以对它所指向的地址存放的内容进行修改。

int *const p=&a;p是常量,不能修改p指向别的地址,但是却可以就该p指向的内容,即*p=b;是可以的,但是p=&b;是不可以的。并且,指正常量必须在声明时就进行初始化,不能先声明然后赋值。如:int *const p;p=*a;这是不可以的。

当指针被作为函数参数传递时,如果我们不想被函数随意修改参数指针指向的内容时,常使用指针常量作为参数。

你可能感兴趣的:(c/c++)