const char *ptr和char const *ptr以及char* const ptr的区别
1. const char *ptr 和 char const *ptr => 这里这么理解,这个表示的是*ptr, 也就是指针指向的值,而修饰这个指针指向的值 (*ptr)的是const char或者char const, 表示两个意思:
const => 表示是个常量,也就是说*ptr这个指针指向的值是个常量
char => 表示字符类型, 也就是说这个指针指向的值是个字符类型的常量
所以,也就是 *ptr是const,不能修改 (也就是说不能通过指针ptr来修改它此时所指向的值*ptr),但是
1. 它并不代表ptr此时所指向的值就是一个常量,只是说此时*ptr不能改,也就是说不能通过指针ptr来改变它此时指向的值*ptr
2. 指针ptr的指向是可以改变的,也就是说我完全可以把指针ptr指向另一个值
eg:
#include <iostream> using namespace std; int main() { char oldArray[] = "china"; char newArray[] = "german"; const char *ptr = old; //定义了一个指向字符常量的指针 ptr[0] = 's'; // 这里试图通过指针ptr来修改它此时指向的值*ptr(china), 直接报错 oldArray[0] = 't'; //这里没有问题,说明ptr此时所指向的值old数组,它本身并不是一个常量。也就说是此时ptr所指向的值并不是一个常量。但你不能通过ptr来修改它此时所指向的这个old数组 ptr = newArray; //这里是没有问题的,重新对指针ptr进行赋值,现在指针ptr指向的是newArray,也就是说指针ptr的指向是可以改变的 }
2. char* const ptr
定义一个指向字符的指针常数, 这里从写法可以看出: const ptr, 这个const用来修饰指针ptr本身,也就是说这是个const指针,也就是指针不能修改。什么意思呢,也就是说指针的指向不能修改,但是指针指向的内容,是可以改的
1. 这是个const指针,也就是说指针的指向不能修改
2. 指针指向的内容,可以通过指针来进行修改
#include <iostream> using namespace std; int main() { char oldArray[] = "china"; char newArray[] = "german"; const char *ptr = old; //定义了一个指向字符常量的指针 ptr[0] = 's'; // 这里通过指针ptr来修改它此时指向的值*ptr(china), 是完全没有问题的 oldArray[0] = 't'; //这里没有问题 ptr = newArray; //重新给指针赋值,也就是更改指针的指向,这里直接报错 }