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)
为何??
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
提示已经说得很清楚了...
#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才可以修改的
我这么说 不知道楼主明白没有?
其实这是一种解读方式的问题
先给你讲一个简单的例子
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的地址,而不能是其它地址
比如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把它转换成一个非常量
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
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)
为何??
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
提示已经说得很清楚了...
#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才可以修改的
我这么说 不知道楼主明白没有?
其实这是一种解读方式的问题
先给你讲一个简单的例子
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的地址,而不能是其它地址
比如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把它转换成一个非常量
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
const int *p=&a p指向的int类型为只读,不能用(*p)=4 来改变a的值
int * const p = &a p 中读,不能改变p的值 如p = &b