话说有这么一道辨别题(如下),指出这三者的区别。
①char const *p;
②const char *p;
③char *const p;
const,表示只读,不可被改写。这三者都带有const,想区别它们,很简单,只需要看看变量名(也就是上面的P)
离*比较近还是const比较近,如果离*比较近的话,那么说明该变量是一个指向常量的指针,该指针的内容是可改
变的(即可改变指针指向的内存区域),比如上面的①和②,表示p是一个指向常量的指针,该指针p是可以指向其
它区域的,比如给p赋新的值:p = buff;(buff是一个数组名)。
而如果指针变量名离const比较近的话,那就不一样了,它表示该指针是一个常量指针,即该指针只能在声明的时候
被赋初值,而不能声明之后,再给指针赋值,那样子编译的时候,会报错(提示该指针是只读指针,不能被改写)。
当然,该指针所指向的区域的内容是可被改写的,如上面的③,表示p是一个常量指针,若对其进行以下声明:
char *const p = buff;(buff是一个数组名)
那么p不能再赋任何其他值,但对于buff则可以随意修改其内容。
总结:
归根到底,这三者,只有两种情况(①和②是一样的):
一个是指针所指向的区域的内容不能被改写,为只读,但指针能够修改指向的区域;
一个是指针所指向的区域不能被改写,为只读,该该指针所指向的区域的内容能够被改写。
①char const *p;
②const char *p;
③char *const p;
const,表示只读,不可被改写。这三者都带有const,想区别它们,很简单,只需要看看变量名(也就是上面的P)
离*比较近还是const比较近,如果离*比较近的话,那么说明该变量是一个指向常量的指针,该指针的内容是可改
变的(即可改变指针指向的内存区域),比如上面的①和②,表示p是一个指向常量的指针,该指针p是可以指向其
它区域的,比如给p赋新的值:p = buff;(buff是一个数组名)。
而如果指针变量名离const比较近的话,那就不一样了,它表示该指针是一个常量指针,即该指针只能在声明的时候
被赋初值,而不能声明之后,再给指针赋值,那样子编译的时候,会报错(提示该指针是只读指针,不能被改写)。
当然,该指针所指向的区域的内容是可被改写的,如上面的③,表示p是一个常量指针,若对其进行以下声明:
char *const p = buff;(buff是一个数组名)
那么p不能再赋任何其他值,但对于buff则可以随意修改其内容。
总结:
归根到底,这三者,只有两种情况(①和②是一样的):
一个是指针所指向的区域的内容不能被改写,为只读,但指针能够修改指向的区域;
一个是指针所指向的区域不能被改写,为只读,该该指针所指向的区域的内容能够被改写。