📅  最后修改于: 2023-12-03 15:00:01.701000             🧑  作者: Mango
在C/C++编程中,const char * p
,char * const p
和 const char * const p
这三个声明语句虽然看似相似,但实际上存在着很大的区别。
const char * p
const char * p
定义了一个指向常量字符的指针,也可以说是指针所指向的字符为常量,不可更改。但是指针本身的值是可以改变的。因此,下面的操作都是合法的:
const char * p = "hello";
p = "world";
这段代码中,指针 p
的值被改为了 "world"
,但是指针指向的字符 "hello"
是不可更改的。如果试图修改指针指向的字符,编译器将会给出错误提示。
char * const p
char * const p
定义了一个指向字符的常量指针,也可以说是指针本身为常量,不可更改,但是指针所指向的字符是可变的。因此,下面的操作都是合法的:
char str[] = "hello";
char * const p = str;
p[0] = 'H';
这段代码中,指针 p
指向了字符数组 str
的首地址,并被声明为常量指针。虽然指针本身不能改变,但是它所指向的字符是可以更改的。因此,通过 p
指针可以修改字符串的内容。
const char * const p
const char * const p
定义了一个指向常量字符的常量指针,也可以说既指针本身为常量,也指向常量字符。这样的指针既不能修改指针本身的值,也不能修改其所指向的字符。因此,这个指针是一个完整的常量,不能被修改。下面是一个例子:
const char * const p = "hello";
这段代码中,指针 p
既指向了常量字符 "hello"
,同时也被声明为常量指针不能改变。因此,无论是修改指针本身的值还是修改所指向的字符,都会导致编译失败。
三者间的区别可用下图表示: