关于const的用法

时间:2021-07-30 05:28:49
   在一本书上看到这样一段代码:
const int a[10]={1,2,3,4};
int *p;
int i;
p=a;
a[2]=0;  //错误,const数据不能被修改
p[2]=0;  //正确,根据定义p指向的数据不是只读的
有没有大大能够解释下?

15 个解决方案

#1


这个是编译时的类型检测。p是int *,非只读

#2


p是int* 不是const int*
区分常量指针 指针常量的区别

#3



p[2]=0; //正确,根据定义p指向的数据不是只读的

这一句C中要报警告,C++直接错误,怎么能说是正确?

#4


编译下了,错误如下:
E:\vc++6.0\MSDev98\MyProjects\习题\习题.cpp(5) : error C2147: 'a' : const automatic array must be fully initialized
E:\vc++6.0\MSDev98\MyProjects\习题\习题.cpp(8) : error C2440: '=' : cannot convert from 'const int [10]' to 'int *'
        Conversion loses qualifiers
E:\vc++6.0\MSDev98\MyProjects\习题\习题.cpp(9) : error C2166: l-value specifies const object
Error executing cl.exe.

习题.exe - 3 error(s), 0 warning(s)
为何??

#5


引用 4 楼 cs44444 的回复:
编译下了,错误如下:
E:\vc++6.0\MSDev98\MyProjects\习题\习题.cpp(5) : error C2147: 'a' : const automatic array must be fully initialized
E:\vc++6.0\MSDev98\MyProjects\习题\习题.cpp(8) : error C2440: '=' : cannot con……

提示已经说得很清楚了...

#6


const int a[10]={1,2,3,4};是要初始化所有数组元素的值吗? p=a,也不行? 那这书怎么写这样的?

#7


书上错误的例题多了

#8


这些都是编译阶段的类型检查,不同的编译器肯定结果不一样,书上那些都是什么年代的东西

#9


如果非要纠结的话  我跟你解释一下
其实这是一种解读方式的问题
先给你讲一个简单的例子
char a = 0xff;
unsigned char b = a;
printf("%d,%u",a,b);
虽然a和b保存的值一样 但是用%d和%u打印出来结果是-1和255
内容记录的都是0xff  但是由于解读方式不一样 一个是%d一个是%u去解读
也就是说  尽管内容一样 用不同方式去解读  也就不一样了

话说回来 
const int a[10]={1,2,3,4};
int *p = a;
虽然p和a的类型不一样  就犹如第一个例子a和b的类型情况一样 是不一样的   
那么用p去修改内容是跟a的类型是只读的一点关系都没有  因为p初始化的时候
p = a就犹如第一个例子的b = a;只是把a的值给别的变量  
也就是说 p值接收了a的地址  之后p要修改a地址的东西是可以的 因为p本身不是常量指针
是可以修改指向地址的内容值的指针  跟a不一样 
你不能用a改  但是可以把a的地址给另一个只要不是const char *p的来修改a的内容
一句话总结
同样的内容  对其解读和对其修改都是一种操作  不同操作 结果当然是不同的  
上题是取决于p不是const char *p才可以修改的


我这么说   不知道楼主明白没有?

#10


ps:p只是接收了那地址  并非p的类型变为只读  


如果我说错了  请拍砖 指出错误  好让小弟也见识一下  哈哈

#11


但是我这报错了啊。。E:\vc++6.0\MSDev98\MyProjects\习题\习题.cpp(8) : error C2440: '=' : cannot convert from 'const int [10]' to 'int *'
就是说不同类型的是不能转换的?

#12


编译器问题不能把const char * 转化成char *
得强制转化

#13


const变量是指常量。即恒定的变量,即不可改变的变量。
比如const int a = 10;
那么你在后面就不可以改变a的指。
又比如const int *a;
指的这个指针不会改变它所指向的内容
int b;
再比如int* const a = &b;
指的这个指针只能指向b的地址,而不能是其它地址

#14


const_cast

const int *pa=18; 
int *pb=const_cast<int*>(pa); //使用const_cast把它转换成一个非常量

#15


给你解释下这两句

const int *p=&a  p指向的int类型为只读,不能用(*p)=4 来改变a的值 
int * const p = &a   p 中读,不能改变p的值 如p = &b

#1


这个是编译时的类型检测。p是int *,非只读

#2


p是int* 不是const int*
区分常量指针 指针常量的区别

#3



p[2]=0; //正确,根据定义p指向的数据不是只读的

这一句C中要报警告,C++直接错误,怎么能说是正确?

#4


编译下了,错误如下:
E:\vc++6.0\MSDev98\MyProjects\习题\习题.cpp(5) : error C2147: 'a' : const automatic array must be fully initialized
E:\vc++6.0\MSDev98\MyProjects\习题\习题.cpp(8) : error C2440: '=' : cannot convert from 'const int [10]' to 'int *'
        Conversion loses qualifiers
E:\vc++6.0\MSDev98\MyProjects\习题\习题.cpp(9) : error C2166: l-value specifies const object
Error executing cl.exe.

习题.exe - 3 error(s), 0 warning(s)
为何??

#5


引用 4 楼 cs44444 的回复:
编译下了,错误如下:
E:\vc++6.0\MSDev98\MyProjects\习题\习题.cpp(5) : error C2147: 'a' : const automatic array must be fully initialized
E:\vc++6.0\MSDev98\MyProjects\习题\习题.cpp(8) : error C2440: '=' : cannot con……

提示已经说得很清楚了...

#6


const int a[10]={1,2,3,4};是要初始化所有数组元素的值吗? p=a,也不行? 那这书怎么写这样的?

#7


书上错误的例题多了

#8


这些都是编译阶段的类型检查,不同的编译器肯定结果不一样,书上那些都是什么年代的东西

#9


如果非要纠结的话  我跟你解释一下
其实这是一种解读方式的问题
先给你讲一个简单的例子
char a = 0xff;
unsigned char b = a;
printf("%d,%u",a,b);
虽然a和b保存的值一样 但是用%d和%u打印出来结果是-1和255
内容记录的都是0xff  但是由于解读方式不一样 一个是%d一个是%u去解读
也就是说  尽管内容一样 用不同方式去解读  也就不一样了

话说回来 
const int a[10]={1,2,3,4};
int *p = a;
虽然p和a的类型不一样  就犹如第一个例子a和b的类型情况一样 是不一样的   
那么用p去修改内容是跟a的类型是只读的一点关系都没有  因为p初始化的时候
p = a就犹如第一个例子的b = a;只是把a的值给别的变量  
也就是说 p值接收了a的地址  之后p要修改a地址的东西是可以的 因为p本身不是常量指针
是可以修改指向地址的内容值的指针  跟a不一样 
你不能用a改  但是可以把a的地址给另一个只要不是const char *p的来修改a的内容
一句话总结
同样的内容  对其解读和对其修改都是一种操作  不同操作 结果当然是不同的  
上题是取决于p不是const char *p才可以修改的


我这么说   不知道楼主明白没有?

#10


ps:p只是接收了那地址  并非p的类型变为只读  


如果我说错了  请拍砖 指出错误  好让小弟也见识一下  哈哈

#11


但是我这报错了啊。。E:\vc++6.0\MSDev98\MyProjects\习题\习题.cpp(8) : error C2440: '=' : cannot convert from 'const int [10]' to 'int *'
就是说不同类型的是不能转换的?

#12


编译器问题不能把const char * 转化成char *
得强制转化

#13


const变量是指常量。即恒定的变量,即不可改变的变量。
比如const int a = 10;
那么你在后面就不可以改变a的指。
又比如const int *a;
指的这个指针不会改变它所指向的内容
int b;
再比如int* const a = &b;
指的这个指针只能指向b的地址,而不能是其它地址

#14


const_cast

const int *pa=18; 
int *pb=const_cast<int*>(pa); //使用const_cast把它转换成一个非常量

#15


给你解释下这两句

const int *p=&a  p指向的int类型为只读,不能用(*p)=4 来改变a的值 
int * const p = &a   p 中读,不能改变p的值 如p = &b