c和c++中有三种定义:
1.const char *str,
2.char *const str,
3.char const *str.
现总结三者之间的区别:
这是定义了一个指向字符的指针常量,即str的指向不能被修改,但是可以修改指针所指向的内容。
我们可以通过代码来验证修改str指向的内容:
#include
using namespace std;
int main()
{
char arr[] = "abcdefg";//定义一个字符串数组,数组名相当于首元素地址
char* const str = arr;
str[0] = '3';//通过指针p间接修改arr数组的内容
printf("%s\n", arr);
}
结果如下:
但如果我们改变str的指向此时
#include
using namespace std;
int main()
{
char arr[] = "abcdefg";//定义一个字符串数组,数组名相当于首元素地址
char* const str = arr;
str++;//修改str的指向
printf("%s\n", arr);
}
此时编译器报错了
char *const str 就差不多是这样告诉编译器我str是指向a的即数组arr的首元素地址,我str指向你a之后就不能在变了。以后就是你的人了
定义一个指向字符常量的指针,在这里str是一个指向char*类型的常量,也就是不能通过str来修改所指向的内容。用通俗的话来说就是*str的值为const,不能修改。但这并不意味着str所指向的值是一个常量,这个常量是站在str的角度而言,站在str的角度这个值是一个常量。如图所示str指向了arr,可以通过arr来修改arr的值,但不能通过str修改。
#include
using namespace std;
int main()
{
char arr[] = "abcdefg";//定义一个字符串数组,数组名相当于首元素地址
const char* str = arr;
arr[0] = 'w';
arr[1] = 'e';
printf("%s", arr);
}
结果:
通过运行结果我们发现我们可以通过arr直接修改里面的内容,这说明arr里面的内容不是常量。
但如果我们通过str去修改了
我们发现编译器直接报错了:
如果我们修改str的指向了
#include
using namespace std;
int main()
{
char arr[] = "abcdefg";//定义一个字符串数组,数组名相当于首元素地址
const char* str = arr;
str++;
printf("%s", arr);
}
我们发现这是没有问题的
这个其实和上面这种const char *str是等价的也就是 const char *str==char const *str,大家可以自行验证
const char *str和char const *str等价,可以直接修改指针的指向但不能修改指针指向的值。
char *const str可以直接修改指针指向的值但不能修改指针的指向。
其实也可以总结为:const 与*的位置关系如果const在*号的左边那么可以直接修改指针的指向但不能修改指针指向的值。
如果const在*的右边可以直接修改指针指向的值但不能修改指针的指向。
可以为以下三点:
1.定义只读变量,或者常量
2.修饰函数的参数和函数的返回值
3.修饰函数的定义体,这里的函数为类的成员函数被const修饰的成员函数代表不能修改成员变量的值,也就是const成员函数只能调用const成员函数
4.只读对象。只读对象只能调用const成员函数
答案是不能。这是因为c语言中仅仅是在编译层来限定不能对const修饰的变量进行赋值操作。在运行期间是无效的,但在c++中在编译期会把const常量放到符号表中,以后遇到这个常量会去符号表中找。所以在c++中的const修饰的变量是不可能被修改的可以
这里可以参考一下我的这篇初识c++https://blog.csdn.net/qq_56999918/article/details/119747949
拓展:
1.在C语言中的局部const常量是放在栈区全局的const常量是放在只读存储区,所以全局的const无法被修改,只是一个只读变量
2。常量并不只是不可被修改并且他的值在编译期间就已经决定了而不是在运行的时候决定。
3.const和宏是有区别的。宏是在预编译期间完成文本替换,而const发生在编译期间,比宏多了作用域检查和类型检查。
4.在c语言中只有enum才算的上是实现了真正的常量
博主知识水平有限,如果觉得不错的话点个赞。