首页 > 试题广场 >

有以下表达式,请问下列表达式哪些会被编译器禁止?

[不定项选择题]
有以下表达式:
int a = 248, b = 4;
int const c = 21;
const int *d = &a; 
int *const e = &b;
int const * const f = &a; 
请问下列表达式哪些会被编译器禁止?
  • *c=32
  • *d=43
  • e=&a
  • f=0x321f
  • d=&b
  • *e=34
推荐
答案:A B C D 
解释:
int const c=21;  //变量c的值不能改变 
const int *d=&a;  //指针变量d指向的值不能改变
int *const e=&b;  //指针的指向不能改变
int const *f const =&a; //指针不能改变,指针指向的值也不能改变。
选择 A *c = 32;有误  因为c不是指针。
答案 F e=34 是不是有笔误, 如果是*e=34是对的, e=34表示把地址为34的赋值给指针e,就不可以。
编辑于 2015-01-07 14:58:24 回复(6)
这个题是有问题的,
const修饰符,就近原则
发表于 2015-03-10 13:02:14 回复(0)
呵呵,我来打打酱油!
=================
1. 首先 ,int const *f const =&a;
 除了类中的常量成员函数,其他地方找不到这个难看的玩意儿了

2. 分享一个经验:
看如何用const 很多同志都分享什么就近原则啊,看这个看那个,,我真想说好累的记法!
看我的方法:
如:  int  const *  const p;
找到第一个const,  后面除了有个const之外 就是 *  和 p,  那么见证奇迹的时刻来了,
const  *  p  这就是我们要的结果,p指向的内容不可变

找到第二个const,  后面只有个p,   那么见证奇迹的时候到了
const  p,,这就是结果, p不可变

++规则总结如下:找到const, 再看后面除了const的内容,是什么东西,那个东西不能变即是
发表于 2015-04-14 02:14:50 回复(13)
如果 const 位于 * 的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向为常量;
如果 const 位于 * 的右侧, const 就是修饰指针本身,即指针本身是常量。
发表于 2015-03-13 14:56:40 回复(0)
const这个符号的位置一向很写意,容易混淆,分享一个记忆法: 向左读。
例:int *const e=&b;   读作 e is a constant pointer to  an int
       const int *d=&a;   读作 d is a pointer to a constant int
这样很明显看出是常指针和指向常量的指针的差异。
编辑于 2016-09-21 17:07:52 回复(0)
const 在*左边,定值;右边,定向;左右都有,定值定向;(左定值,右定向)
发表于 2015-08-16 10:53:47 回复(0)
此题要是搞清楚const指针和指向const对象的指针就不难了
简单的讲:
1)const指针是一个指针,其const类型决定了其指向对象的地址不能改变,但是指向对象的值可以改变
定义形式:
  1. int  errNumb=0;  
  2. int  * const  curErr = &errNumb;        //curErr is const   
 2)指向const对象的指针,它指向的对象是const类型,故对象的值是不能改变,但指针本身不是const类型,故其指向的地址可以改变
定义形式:const double *cptr; 
3)指向const对象的const指针,其指向对象的地址和值都不能更改

判断指针是const指针还是指向const对象的指针,可以通过判断const是与*先结合还是与对象类型先结合;
int  * const  curErr = &errNumb;从右往左读可判断出 curErr是一个const指针( * const ),其指向对象的类型为int 型;
const double *cptr;就是一个指针,指向的对象类型都const 的double类型
回到题目:
A:c是一个const常量,其值不能修改了,故企图将c改为32会出错
B:  d是指向const对象的指针,其指向的值不能更改,故企图将d指向对象的值改为43会出错;但可以更改其指向对象的地址,故E是对的
C:  e是一个const指针,其指向对象的地址不能更改 ,故将e指向的地址更改为b所在的地址会出错;但其指向对象的值可以更改,故F是对的
D:  f是指向const对象的const指针,故任何企图更改其指向对象的地址或值的操作都会出错

写得有点多,谢谢您的耐心阅读,希望对你有帮助! const指针与指向const对象的指针也已参考: http://blog.csdn.net/u012824097/article/details/52485339 

发表于 2016-09-10 12:33:11 回复(0)
左定值,右定址:
const* : 指向定值
*const:指向定址  

f是指向const对象的const指针,故任何企图更改其指向对象的地址或值的操作都会出错

发表于 2017-05-02 20:07:16 回复(0)
const* 常量指针,即身为常量的指针,那么指针不能改变。
*const指针常量,常量是修饰着常量后面跟着的变量名,即后面的变量名是一个常量、
发表于 2015-09-14 14:51:28 回复(1)
const int和int const修饰的是int,不可更改值 int *const修饰的是指针,不可更改地址指向 const int *const即修饰了int也修饰了指针,都不可以更改
发表于 2023-10-07 18:03:42 回复(0)
此题答案是否有问题?
    选项E  的表达式应该是合法的吧。
    const int *d=&a;//d is a pointer to a const int variable,
     表示d是一个指向常量的指针, 不能通过该指针来修改其指向的值, 但是该指针并非常量指针,是可以修改 指针的指向的。
   愚见 正确答案 应该是 : ABCD
发表于 2018-04-04 11:17:53 回复(0)
左定值,右定址。
发表于 2017-03-01 20:43:31 回复(0)
我去,严重不懂了,我老觉得是-31
发表于 2016-08-29 15:50:14 回复(0)
inta=248, b=4;
intconstc=21;
constint*d=&a; 
int*conste=&b;
intconst* constf =&a; 
选项E:d=&b 正确;
左定量,右定向;(即 const 在 * 左边,指针指向的变量为常量;const 在 * 右边,指针指向的地址不能更改。)
对于选项E,d指向的变量为常量,初始化时将a的地址赋给d,说明a是常量即a的值不能改变,故选项B错误; 而选项E中是重新将b的地址赋给指针d,并未改变a的值,因此是正确的。
发表于 2016-08-26 00:24:25 回复(0)
选项E为什么不对??????
发表于 2015-08-21 21:23:41 回复(1)
题目的f输进去会报错。应该是const int const f  =&a; 
编辑于 2015-04-08 11:53:02 回复(0)
所以a选项的*c=32是啥意思。。。
发表于 2022-05-16 15:55:32 回复(0)
C和E冲突了吧,只能对一个
发表于 2021-12-30 13:57:55 回复(0)
A选项弄错了,所以去linux 上面测试了一下。A选项的操作的确被禁止了。

发表于 2020-06-28 19:59:59 回复(0)
变量c 不是指针 指针d 所指向的内存不可更改 e是const修饰, 不能修改其的指向 f也被const修饰, 不可改变指向
发表于 2024-01-20 00:57:57 回复(0)
这道题对了,很快乐
记得两点,const int * p和int const * p是一样的,不可改变地址的值也就是不能 *p=XXX;
int * const p是不可改变地址指向

发表于 2023-10-22 17:31:30 回复(0)