最近一直在准备笔试,补补大一大二欠下的课。复习c语言时碰见这么个题:
1
2
3
4
5
|
int a= 248 , b= 4 ; int const c= 21 ; const int *d=&a; int * const e=&b; int const * const f =&a; |
请问下列表达式哪些会被编译器禁止?
A:*c=32
B:*d=43
C:e=&a
D:f=0x321f
E:d=&b
F:*e=34
下面逐条分析
第一行代码不提, 第二行,int
const
c=
21
;和const int c=21;是一个意思,都是修饰c为const,即c的值不能变化。所以A,肯定错,c就不是一个指针;
第三行:const
int
*d=&a;表示d指向的值是不可通过指针改变的,所以B:*d=43错误。而d的指向是可变的,这里d=&a,E:d=&b也是正确的;
第四行:int
*
const
e=&b;表示指针e的指向是不能改变的,所以C错;但可以改变指向的值,*e=34是正确的,F正确;
第五行:int
const
*
const
f =&a;表示指针f的指向和指向的内容都不能改变,D错误
这里百度百科里介绍了一个方法:
题目问哪些会被禁止,所以答案是ABCD。
const在*的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在*的右边,则指针的指向不可变。简记为“左定值,右定向”
但是一定要注意,int * const p; int const * const p; 或者 const int * const p;这三种表示都是指针指向不能改变的,定义时要初始化一个地址。
基本上const就没问题了~